<?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[Build Rad Shit]]></title><description><![CDATA[Building rad shit people love. Product lessons and experiments from 18+ years of shipping products at Google—and the side quests I build to learn.]]></description><link>https://trond.ai</link><image><url>https://substackcdn.com/image/fetch/$s_!xujV!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70908135-6a10-4d6a-ba00-63681e797be2_1024x1024.png</url><title>Build Rad Shit</title><link>https://trond.ai</link></image><generator>Substack</generator><lastBuildDate>Thu, 20 Aug 2026 17:46:21 GMT</lastBuildDate><atom:link href="https://trond.ai/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Trond Wuellner]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[radshit@trond.ai]]></webMaster><itunes:owner><itunes:email><![CDATA[radshit@trond.ai]]></itunes:email><itunes:name><![CDATA[Trond Wuellner]]></itunes:name></itunes:owner><itunes:author><![CDATA[Trond Wuellner]]></itunes:author><googleplay:owner><![CDATA[radshit@trond.ai]]></googleplay:owner><googleplay:email><![CDATA[radshit@trond.ai]]></googleplay:email><googleplay:author><![CDATA[Trond Wuellner]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Check Your Work]]></title><description><![CDATA[How to use evals and adversarial testing to build better AI.]]></description><link>https://trond.ai/p/check-your-work</link><guid isPermaLink="false">https://trond.ai/p/check-your-work</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 18 Aug 2026 14:41:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gcDp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gcDp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gcDp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!gcDp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!gcDp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!gcDp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gcDp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152482,&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://trond.ai/i/211326350?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.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_!gcDp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!gcDp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!gcDp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!gcDp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3b11cb7-ced5-4b74-8508-130c2bb7943a_1456x816.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A few weeks ago, I shared the <a href="https://github.com/stellawuellner/math-worksheets-skill">math worksheet generator</a> with the math teachers at my daughter&#8217;s school. One of them asked a great question:</p><blockquote><p>&#8220;I use AI regularly to help develop math problems, investigations, and instructional materials, but mathematical accuracy remains one of my biggest concerns. I&#8217;d love to better understand the practices and tools you use to catch errors, verify solutions, and recognize when an AI-generated result should not be trusted.&#8221;</p></blockquote><p>It&#8217;s an interesting question, because I&#8217;m not sure it&#8217;s obvious to people the work that goes on behind the scenes in AI product companies and at frontier labs to drive more trustworthy and reliable results. Or that a lot of it is actually pretty accessible with readily available tools.</p><p>Nobody can guarantee an 100% accurate result from an AI system, and I&#8217;d be suspicious of anyone who claims to. What you can build is a system that knows which of its outputs deserve trust and that is transparent about it. It&#8217;s one of the things I love most about Gemini Notebook (<em>fka NotebookLM</em>) and I want to hold the same standard for the Math Worksheets system. It should do the work to earn trust and be clear where the lines are. </p><p>Let&#8217;s talk about the eval system and the in-line quality guards I built as an example for how you too can use these patterns when building AI tools.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Principles</h2><p>As a quick refresher, our math generator system takes a math topic and a number of requested problems and uses AI to create three PDF formatted documents: a worksheet, a step-by-step answer key, and a study guide. The study guide, worksheet and answer key all need to be aligned, well-written and critically the answers need to be correct!</p><div class="callout-block" data-callout="true"><p><strong>Rule #1:</strong> Check your work.</p></div><p>That&#8217;s because AI can&#8217;t be trusted to deliver accurate results on it&#8217;s own. In my system, the model&#8217;s job is to propose problems as structured data that can be independently verified: <em>&#8220;problem 4 is a triangle with sides 9 and 13 and a 36 degree angle, solve for angle B, and I claim the answer is 58.07.&#8221;</em> </p><p>A separate system that knows how to do math, checks the answers. In our approach, this is a fixed program (built on SymPy, an open-source computer algebra system that predates modern AI and does math the old-fashioned deterministic way) computes every claim. If the model&#8217;s answer is wrong, the proposal is rejected and another question is generated. The printed answer key is then checked again, character by character, against the verified values, so a typo between &#8220;verified&#8221; and &#8220;printed&#8221; also fails the build.</p><p>Models often hallucinate, and in our system the model can hallucinate all it wants because we don&#8217;t trust it not to. We check our work with a different math tool every time. This way, wrong answers never reach the paper.</p><p>For example: The number 58.07 in the question above is a real proposed AI answer for a test worksheet, and <strong>it is wrong</strong>.  It&#8217;s one example from a law-of-sines worksheet that the verifier rejected. It took the AI tool four tries to get a correct solution, with answers that were off by between 0.01 and 0.23. The correct answer was 58.11, and AI really struggled to do it correctly. If we weren&#8217;t checking our work, this would have passed an eyeball test yet still be incorrect. Disaster for someone learning the skills.</p><div class="callout-block" data-callout="true"><p><strong>Rule #2:</strong> Take lots of practice tests.</p></div><p>To confirm our system performs as expected, we designed a robust practice test. In the AI world, we call these evals. Essentially, this is a large set of practice problems we can test ourselves against. For the math worksheet system, I created a set of 300 math topics ranging from counting to calculus to serve as example tests.</p><p>I then used the math worksheet system to generate 10-problem worksheets, answer keys and study guides for every one of the 300 topics. If everything is correct on all 300 of these worksheets, then we can feel pretty good about the operations of the system. </p><p>Some of you sickos would probably enjoy hand working 3000 math problems on a Saturday. I&#8217;m a bit lazier than that, so I wrote a different AI tool to help us grade whether the answer keys were correct. The tool employed a similar SymPy math engine, but also considers broader topics like whether problems actually teach the requested topic and whether they get progressively more difficult across the worksheet. There&#8217;s a lot you can do in a critic system to improve your quality.</p><p>But I skipped something super important. You absolutely must use a different AI system for critique than the one you use for creation. If you ask an AI to grade itself, it pats itself on its back and misses issues. When you ask one AI to critique another AI, they find all sorts of issues.  </p><p>By running this system, I found dozens of edge cases we fixed and vastly improved the overall quality of the worksheets we generate. Some were pretty gnarly math issues, some were formatting problems a math checker could never spot, and others were just silly problems like not leaving enough space for the student to work out an answer. </p><p>I ended up running the eval suite 3 separate times before we started hitting diminishing returns on improvements. That&#8217;s when the outputs felt consistently great. There are probably harder evals yet to be designed and even more problems we can uncover, but that&#8217;s an assignment for another day. By taking these practice tests, we make many observations allowing us to climb the hill of quality and deliver a better overall experience. </p><div class="callout-block" data-callout="true"><p><strong>Rule #3:</strong> Confirm what AI means by &#8220;<em>verified</em>.&#8221;</p></div><p>If the story ended there, this would just be a nice little architecture diagram and a self-indulgent blog post. But AI is a sneaky beast and you need to test your verification systems, because a green checkmark is a claim about the checker as much as about the content it&#8217;s testing. </p><p>In one case, we caught the AI system submitting different questions to the checker than what the question was actually asking. It once asked students to find the value of c that makes a function continuous, but in its verification entry asserted that 9 is the solution because &#8220;c minus 9 equals 0.&#8221; I mean, that&#8217;s true, but it was also completely irrelevant to the question it actually asked. </p><p>We only found this class of issue through testing, so we now run automated lints that catch these types of issues during the generation process. As the recent Claude and OpenAI stories about AI escaping confinement implies, we&#8217;ll probably find other ways AI tries to take shortcuts in the future. But knowing is half the battle. </p><div class="callout-block" data-callout="true"><p><strong>Rule #4:</strong> Understand what you&#8217;re checking.</p></div><p>Unsurprisingly, understanding the tests you&#8217;re implementing is critical, or you&#8217;ll create false precision or overlook something essential. At one point our numeric comparison was being too strict about decimals, in a floating-point way that had nothing to do with the math. We found five separate cases where the authoring model had changed correct mathematics to satisfy the checker. A physics constant of 4.9 became a tidy 5. A perfectly good 9.4 became 9.5. Nobody decided to lie; the path of least resistance was just worse math. </p><p>If your verification rejects correct answers, it will eventually manufacture wrong ones. We rebuilt the comparison to understand significant figures so a value like 6.30 is accepted at the precision it was written to, and exact things are still compared exactly.</p><div class="callout-block" data-callout="true"><p><strong>Rule #5:</strong> State your assumptions.</p></div><p>This is the part of the teacher&#8217;s question I most want to answer directly, because the trustworthy part of the system is precisely that it knows its own edges. Not every question that&#8217;s relevant on a math worksheet can be answered by a computer.  Some require the expert hand of a real teacher.</p><p>Proofs, constructions, graph sketches, and every &#8220;explain your reasoning&#8221; question cannot be verified by a formula checker, and we can&#8217;t pretend otherwise. In our system, problems like this are declared clearly, and the printed answer key marks it with a spade (<em>we picked &#9824; because no mathematics on these pages uses the symbol, so it can mean exactly one thing</em>). </p><p>The answer key&#8217;s summary page highlights these questions and adds a note: <em>&#8220;14 of 17 answers machine-checked. &#9824; marks an answer only you can judge.&#8221;</em> A sheet where nothing is machine-checkable refuses to build at all unless the author explicitly acknowledges this intention, because a sheet with zero verification probably shouldn&#8217;t look the same as a sheet with full verification.</p><p>We also don&#8217;t claim the checks prove a problem is <em><strong>good</strong></em>. Verification can at best prove the math and its transcription. It cannot prove the problem teaches what you wanted, at the level you wanted. That judgment stays with teachers, who remain as always indispensable.</p><div><hr></div><h2>Takeaways</h2><p>If you&#8217;re building AI systems, there are a few important things to remember.</p><ol><li><p><strong>Never let AI grade itself</strong>. Check answers with a different tool than the one that wrote the problems: a calculator, Desmos, a spreadsheet, WolframAlpha. Independence matters more than sophistication. Asking the same AI &#8220;are you sure?&#8221; is a second sample from the same distribution, not a second opinion.</p></li><li><p><strong>Make AI produce checkable claims.</strong> &#8220;The answer is 58.11&#8221; can be tested. A worked paragraph that arrives at an answer somewhere in the middle cannot, easily. Ask for the final answers as a separate list and check those.</p></li><li><p><strong>Ask what was verified, not whether.</strong> The vacuous-check problem lives in human workflows too. &#8220;I double-checked it&#8221; can mean anything.</p></li><li><p><strong>Be transparent about assumptions.</strong> Make AI label which parts of its output require human judgement or are based on assumptions. Ours does, with a spade.</p></li><li><p><strong>Distrust confident specificity.</strong> The fabricated number-line citations were detailed, plausible, and wrong. Detail is what makes a claim checkable, not what makes it true. AI loves to gaslight you with plausible sounding answers that are just plain wrong.</p></li><li><p><strong>Make it obvious when a check can&#8217;t run.</strong> The most dangerous state is not &#8220;wrong&#8221; but &#8220;unverified and indistinguishable from verified.&#8221;</p></li></ol><p>Hopefully, this can help you as you think about making your own AI tools and give you a bit more language and familiarity for when and how to trust these systems. </p><p>If you want to learn more, everything above is public, including the eval runs, generated worksheets, planted-defect experiments, and the analyses where our first conclusions got corrected by later evidence, at <a href="https://github.com/stellawuellner/math-worksheets-skill">https://github.com/stellawuellner/math-worksheets-skill</a>. The commit history includes every case where we were wrong, which by this point I consider a feature of the verification system.</p><p>Now, get out there and build rad shit!</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/check-your-work?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/check-your-work?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/check-your-work?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Improved! Math Worksheet Generator ]]></title><description><![CDATA[Sharing an updated math worksheet generator you can use with any AI Agent. Now covering all curriculum through high school, with verified answer keys and study guides for any topic you're studying.]]></description><link>https://trond.ai/p/improved-math-worksheet-generator</link><guid isPermaLink="false">https://trond.ai/p/improved-math-worksheet-generator</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 28 Jul 2026 14:54:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wcOX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wcOX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wcOX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!wcOX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!wcOX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!wcOX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wcOX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1456,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Improved! Math Worksheet Generator. One request produces three pages: the worksheet, a study guide, and the answer key.&quot;,&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="Improved! Math Worksheet Generator. One request produces three pages: the worksheet, a study guide, and the answer key." title="Improved! Math Worksheet Generator. One request produces three pages: the worksheet, a study guide, and the answer key." srcset="https://substackcdn.com/image/fetch/$s_!wcOX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!wcOX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!wcOX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!wcOX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066da2e6-7d4f-41ad-84f0-448ebbb90936_1456x816.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Improved! Math Worksheet Generator. One request produces three pages: the worksheet, a study guide, and the answer key.</figcaption></figure></div><p>I spent eight years handwriting math worksheets for my kids before I built a tool to do it for me. That tool was good. Every worksheet I ever handed my kids was correct, and I'd grown to trust it for the day-to-day math practice they needed.</p><p>But a new school year is coming, and both my kids are on an advanced math track. My son is starting 10th grade and is on pace to take Calc BC by senior year. My daughter starts 8th grade on a similar path. I wanted the worksheet tool to grow along with them and cover algebra, geometry, trig, word problems, and eventually calculus. Basically the whole math curriculum through high school.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>That's a much bigger surface area than what the first version of my tool covered, and it changed what I needed it to do. The system needed to cover hundreds of new problem types I hadn't yet tested. I didn't just want to expand the scope and hope it kept working. I wanted to raise the bar, so when it takes on a new corner of the curriculum I can prove it's right rather than merely assume so.</p><p>So I rebuilt it last week. The new version does several important new things.</p><h2>Works with your favorite AI agent</h2><p>The old version was built for OpenClaw, which is great for me but a bunch of people told me they had no idea what that is. More people have access to a tool like Gemini, ChatGPT or Claude, so I fixed the limitation.</p><p>The rewrite is packaged as a skill: a folder with a <code>SKILL.md</code> file, some reference material, and a verification script any coding tool can load. Claude Code, Gemini, and Codex all standardize on this instruction format, which is nice. There's no per-tool version to maintain because there's only one skill, and it works out the local environment on its own (which LaTeX engine is installed, what model config is present) instead of assuming a particular configuration.</p><h2>Thoroughly checks the answers</h2><p>The model still writes the problems and proposes answers. But now before anything gets rendered, every answer is checked against SymPy, an actual computer algebra system, the same class of engine that sits under Mathematica. If SymPy can't confirm the answer, we rework the problem.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2eZ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2eZ4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png 424w, https://substackcdn.com/image/fetch/$s_!2eZ4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png 848w, https://substackcdn.com/image/fetch/$s_!2eZ4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png 1272w, https://substackcdn.com/image/fetch/$s_!2eZ4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2eZ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png" width="1456" height="700" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:700,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1456,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A worked solution from the answer key. The boxed value is the one SymPy confirmed before the page was allowed to print.&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A worked solution from the answer key. The boxed value is the one SymPy confirmed before the page was allowed to print." title="A worked solution from the answer key. The boxed value is the one SymPy confirmed before the page was allowed to print." srcset="https://substackcdn.com/image/fetch/$s_!2eZ4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png 424w, https://substackcdn.com/image/fetch/$s_!2eZ4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png 848w, https://substackcdn.com/image/fetch/$s_!2eZ4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png 1272w, https://substackcdn.com/image/fetch/$s_!2eZ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F659fc6ae-d08e-40a6-97bd-a2b1eb102c98_1456x700.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A worked solution from the answer key. The boxed value is the one SymPy confirmed before the page was allowed to print.</figcaption></figure></div><p>There are 24 specific verification types, because "check the answer" means something different depending on the problem. For example:</p><ul><li><p>Solving an equation over the set of real numbers is not the same as solving it over the set of complex numbers.</p></li><li><p>A definite integral gets confirmed symbolically when SymPy can do it exactly, and falls back to convergence-checked numerical quadrature when it can't. If that doesn't converge, the problem is flagged for review.</p></li><li><p>Triangles get the law of sines and cosines, including the ambiguous SSA case.</p></li></ul><p>Statistics, probability, limits, series, systems of equations, reading a value off a chart: each has its own checker, and each has its own idea of what "correct" answers look like.</p><h2>Passes comprehensive evaluation</h2><p>Next, I challenged the answer system with real problem sets. Every step in the <a href="https://github.com/openai/grade-school-math">GSM8K</a> collection of grade-school word problems and every boxed answer I could pull out of a <a href="https://github.com/hendrycks/math">public dataset of competition math problems</a> went through the verifier. I evaluated 4,282 checks from the first set and 2,711 from the second. Just under 7,000 checks in total and across the eval set we hit zero false positive results.</p><p>It seemed too good to be true, so I went looking for trouble. I ran two rounds of adversarial audits against my own verifier, hunting for cases where it might confirm something false as I stretched it into harder math. Both rounds found real problems, and the second surfaced eight subtle issues at the edges of the new coverage, including:</p><ul><li><p>The definite-integral checker was using a quadrature method that gave wrong values on oscillatory integrands.</p></li><li><p>The interval solver couldn't see tangent roots, the places where a curve kisses the x-axis without crossing.</p></li><li><p>The system-of-equations checker would accept a solution that satisfied only one branch.</p></li><li><p>The probability checker didn't confirm that a probability landed between 0 and 1.</p></li></ul><p>These are exactly the failure modes you'd never notice by eye on an advanced worksheet, which is the whole point of having a machine check them. I fixed all eight and pinned each fix with a regression test, so they can't come back. I haven't been able to find others, but you never know.</p><h2>Ready for any grade level</h2><p>Correct answers are the minimum bar. A worksheet also has to be the right worksheet: the right concept, at the right level, for where the kid actually is.</p><p>So all problems are now mapped to real curriculum standards. Common Core codes for K-12, and the AP Course and Exam Description for the calculus track. Each concept carries a difficulty rating from 1 to 5 and a Bloom's-taxonomy tag for cognitive level, so "quadratics" can mean <em>plug into the formula</em> or <em>derive the discriminant condition</em> depending on what you ask for.</p><p>To find coverage gaps, I ran the whole thing against the <a href="https://github.com/withmarbleapp/os-taxonomy">Marble team's open taxonomy</a> of what students learn.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PdIG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PdIG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png 424w, https://substackcdn.com/image/fetch/$s_!PdIG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png 848w, https://substackcdn.com/image/fetch/$s_!PdIG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png 1272w, https://substackcdn.com/image/fetch/$s_!PdIG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PdIG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png" width="1456" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:900,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1456,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The 503 mathematics topics in the Marble taxonomy. Height is age, colour is domain, and each thread is a prerequisite: something you have to learn before the topic it points to.&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The 503 mathematics topics in the Marble taxonomy. Height is age, colour is domain, and each thread is a prerequisite: something you have to learn before the topic it points to." title="The 503 mathematics topics in the Marble taxonomy. Height is age, colour is domain, and each thread is a prerequisite: something you have to learn before the topic it points to." srcset="https://substackcdn.com/image/fetch/$s_!PdIG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png 424w, https://substackcdn.com/image/fetch/$s_!PdIG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png 848w, https://substackcdn.com/image/fetch/$s_!PdIG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png 1272w, https://substackcdn.com/image/fetch/$s_!PdIG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eba8ad8-70a6-40e0-ac10-5e1213fa13ae_1456x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The 503 mathematics topics in the Marble taxonomy. Height is age, colour is domain, and each thread is a prerequisite: something you have to learn before the topic it points to.</figcaption></figure></div><p>About 40% of that taxonomy isn't machine-verifiable. "Write a story problem about sharing" has no single right answer a computer algebra system can confirm. The tool doesn't pretend otherwise. It knows which problems it can prove and which it can't, and it says so instead of dressing up a guess we check the result.</p><h2>Keeping the system healthy</h2><p>Finally, I implemented a robust regression and code quality test system to make sure any future changes don't re-introduce a problem we've solved before.</p><p>The suite covers 91% of the code, and continuous integration blocks any change that drops it below 90%. Every audit finding has a dedicated test, and every verification type ships with fixtures that must pass before I make a software update. Whether the thing that checks correctness is itself correct isn't a matter of my confidence. It's measured every time I make a code change to this system. The safety net allows me to add curriculum coverage without wondering whether I broke the system.</p><h2>Ready for you</h2><p>The updated math worksheet generation tool can now create worksheets for math topics from counting through calculus, and ready for the school year ahead. The whole thing is open source, and the verification layer is included. The system is honest about what it can and can't prove. It tells you when it's sure, and when it isn't, and it holds that line even as the math gets harder.</p><p>Download the skill: <a href="https://github.com/stellawuellner/math-worksheets-skill">github.com/stellawuellner/math-worksheets-skill</a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[What a darkroom hobby teaches you about shipping AI products]]></title><description><![CDATA[Part three, and the last of the GlassMeter posts. The lessons from a hobby that followed me back to my day job.]]></description><link>https://trond.ai/p/what-a-darkroom-hobby-teaches-you</link><guid isPermaLink="false">https://trond.ai/p/what-a-darkroom-hobby-teaches-you</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 21 Jul 2026 15:36:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cG82!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cG82!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cG82!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cG82!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cG82!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cG82!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cG82!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg" width="1456" height="665" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:665,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1268810,&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://trond.ai/i/202812504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.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_!cG82!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cG82!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cG82!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cG82!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df269a-fb28-478a-accd-fca492ad8ae2_5015x2289.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A selection of prints from my final project in Darkroom III at Foothill College.  All made with the benefit of the GlassMeter app.</figcaption></figure></div><p>This is the third and final post about GlassMeter, the film light meter I built to actually understand how metering works. The <a href="https://trond.ai/p/i-built-a-light-meter-to-understand">first</a> was the why: a broken meter, a darkroom class, nine months of nights. The <a href="https://trond.ai/p/i-let-an-agent-rewrite-my-whole-app">second</a> was the afternoon an AI agent rewrote the whole app. This one is the part I didn't see coming, which is how much a hobby about hundred-year-old film chemistry taught me about my actual job, building AI products.</p><p>I build software for a living. I did not expect a light meter for film nerds to be where some of my clearest product lessons of the year came from. But the distance helped. It's easier to see how you work when the stakes are a roll of Tri-X instead of a launch. Here's what transferred.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Build for an audience of one, ruthlessly</h2><p>The bar I set for GlassMeter was selfish and specific: would I carry it into the field instead of my real meter? Not "would people like it." Would <em>I</em> reach for it, on a real shoot, when getting it wrong meant a wasted sheet of film. For a long time the answer was no, and that no was the entire to-do list.</p><p>A single, demanding, real user surfaces truth faster than a fuzzy imagined million. The failure mode I see constantly in AI products is building for "users" in the abstract, an average person who doesn't exist, and shipping something that's plausible to everyone and indispensable to no one. One sharp user you actually know, even if that user is you, keeps the scope honest. They notice the thing that's <em>almost</em> right, which is the thing that matters.</p><h2>Make the magic auditable</h2><p>It is easy to fake a film look. Drop a preset, warm it up, add grain, call it Portra. I refused to do that. Every film stock in GlassMeter is built from the manufacturer's own published datasheet, the real characteristic curves and reciprocity tables, and I wrote the engineering notes so a stranger could check my work. When the app says Tri-X needs a stop more light at one second, that traces to a number Kodak printed.</p><p>The pull in AI is the exact opposite direction. The incentive is the dazzling demo, the answer that sounds authoritative and can't be inspected. But the products people actually come to trust are the ones that show their work: the citation, the eval, the honest "here's where this is shaky." In the GlassMeter post I included a whole section on where the app is still wrong, on purpose. Naming the limits is not a weakness in a tool people rely on. It is the thing that makes them able to rely on it.</p><h2>Let the domain write the roadmap</h2><p>I never sat down and brainstormed a feature list for GlassMeter. My darkroom syllabus wrote it for me. Darkroom I was 35mm and the fundamentals. Darkroom II brought the Zone System, push processing, and contrast filters. Darkroom III is large format. Each idea showed up in class on a Tuesday and in the app a week or two later, because I was living the workflow and feeling exactly where it hurt.</p><p>You cannot fully shortcut that with user interviews. There's a kind of product knowledge you only get by doing the work yourself, badly, until you feel the friction in your own hands. The PM version of "go shoot the film" is to actually live inside the workflow you're building for until the roadmap becomes obvious rather than invented. The best features I've ever shipped came from being annoyed personally, not from a research deck.</p><h2>Treat your foundations as reversible</h2><p>The second post in this series was about an agent rewriting the app in an afternoon. The product lesson underneath that story is bigger than one rewrite: the cost of changing your mind about a foundation has dropped through the floor.</p><p>That changes how you should make early decisions. For years the smart move was to agonize over the first architecture, because you'd be stuck with it. Now the smart move is often to build the fastest version that teaches you something, knowing you can re-pour the concrete later for cheap. Optimize the early phase for learning velocity, not for being right the first time. The thing you learn from the wrong version is what lets you specify the right one, including to an agent.</p><h2>Ship when you reach for it, not when the calendar says</h2><p>I didn't release GlassMeter on a date. I released it the week the honest answer to "do I reach for this first" finally flipped to yes. No readiness signal is more trustworthy, and none is more tempting to override with a roadmap commitment or a launch window.</p><p>Dogfooding isn't a QA step you do at the end. It's the spec. If the people who made the thing don't actually use the thing, no amount of polish fixes what that's telling you.</p><h2>Restraint can be the product</h2><p>GlassMeter collects nothing. No account, no analytics, no servers, no network calls at all. The App Store privacy label reads "Data Not Collected," because there is nothing to collect. That wasn't a sacrifice I made grudgingly. It's one of the best things about the app.</p><p>In a field whose default setting is to instrument and capture everything, deciding <em>not</em> to is increasingly the differentiator. Saying no to a feature, a data grab, a bit of cleverness, is a product decision with as much weight as any feature you add. Often more.</p><h2>The real return</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lGYB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lGYB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lGYB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lGYB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lGYB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lGYB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg" width="1456" height="1097" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1097,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1865352,&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://trond.ai/i/202812504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.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_!lGYB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lGYB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lGYB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lGYB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc6b6953-d272-4cff-90de-12c7109f8b35_3331x2509.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A photo of one of my favorite prints from the class.  It&#8217;s a portrait of an Australian Tea Tree found in Golden Gate Park in San Francisco.</figcaption></figure></div><p>The artifact, a light meter used by a handful of film photographers, is not the return on nine months of nights. The return is judgment, and I spend it every single day at work.</p><p>The whole case for building to learn is simple. The small, deep version of a thing is the cheapest way I know to earn a real opinion about how something works, and opinions are the only thing that actually transfer. You can't borrow them from a blog post, including this one. You have to go build the thing and let it correct you.</p><p>So pick yours. The system you've been circling, half-understanding from the outside. Build the small version, badly, and let it fail at you until it hands you the map. It has never once let me down.</p><div><hr></div><p><em>That wraps the GlassMeter series. If it sounds like your kind of thing, it's on TestFlight at <a href="http://glass-works.ai">glass-works.ai</a>, and if you go build your own rad thing because of these posts, tell me what it taught you.</em></p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/what-a-darkroom-hobby-teaches-you?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/what-a-darkroom-hobby-teaches-you?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/what-a-darkroom-hobby-teaches-you?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Using Antigravity to switch from React to Swift in one shot]]></title><description><![CDATA[Part two of the GlassMeter story. What "one-shot" agentic coding actually feels like, and what it changed about how I build.]]></description><link>https://trond.ai/p/using-antigravity-to-switch-from</link><guid isPermaLink="false">https://trond.ai/p/using-antigravity-to-switch-from</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 14 Jul 2026 15:54:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!0VWa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0VWa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0VWa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png 424w, https://substackcdn.com/image/fetch/$s_!0VWa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png 848w, https://substackcdn.com/image/fetch/$s_!0VWa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png 1272w, https://substackcdn.com/image/fetch/$s_!0VWa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0VWa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png" width="1456" height="1470" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1470,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2240387,&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://trond.ai/i/202812468?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.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_!0VWa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png 424w, https://substackcdn.com/image/fetch/$s_!0VWa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png 848w, https://substackcdn.com/image/fetch/$s_!0VWa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png 1272w, https://substackcdn.com/image/fetch/$s_!0VWa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35533e2a-7fab-4988-a7b8-bf07157e2486_1676x1692.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">An early rough version of GlassMeter from when it was built in React</figcaption></figure></div><p>A couple of weeks ago I wrote about <a href="https://trond.ai/p/i-built-a-light-meter-to-understand">GlassMeter</a>, the film light meter I built because I bought a Hasselblad with no meter and discovered I had no idea how to expose a scene without one. That post was about <em>why</em> I built it. This one is about a single afternoon last November when an AI agent rebuilt the entire thing in a language I barely knew, and what that did to my sense of how software gets made.</p><p>First I have to tell you about the two months I left out of the last post.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The version I don't show people</h2><p>GlassMeter started life as a React Native app called GroundGlass. I reached for React Native because it's where I'm fast, and I wanted to be moving. For about two months it worked, sort of. It put a number on the screen. It had rotary dials and a calibration screen and a little tutorial.</p><p>But a light meter lives or dies on one thing: what it can read off the camera sensor, frame by frame, in real time. And every layer I'd stacked between my code and that raw pixel buffer was a place where the truth got rounded off, or slowed down, or fought me. I was writing native camera modules and then reaching them through a bridge, which is a polite way of saying I was doing the hard part twice. The abstraction I'd picked to go faster had quietly become the ceiling on what the app could ever be.</p><p>So I knew it had to be native Swift. And I dreaded it. A from-scratch rewrite, in a language and a UI framework I'd never shipped, was exactly the kind of multi-week slog that kills side projects in the crib. I had a working-ish app with a barrier in front of the version I actually wanted.</p><h2>The afternoon</h2><p>Then Google <a href="https://en.wikipedia.org/wiki/Google_Antigravity">Antigravity</a> launched an agent-first coding environment, and I did the thing you do with a new toy. I pointed it at the React Native repo and asked it to port the whole app to native Swift and SwiftUI.</p><p>It did. In one pass. Not a function, not a file, the app: the metering screen, the dials, the film selection, the settings, rebuilt natively. My commit history from that day reads like a single held breath. "Pre-Swift transition: save current React Native state," and then, minutes later, "Migrate to native Swift/SwiftUI, archive React Native code." The entire React Native version is still sitting in the repo in a folder literally named <code>__ARCHIVE__</code>, a whole parallel app I will never touch again.</p><p>I want to be honest about what "one shot" does and doesn't mean, because the phrase gets oversold. It does not mean I typed a sentence and went to get coffee and came back to a finished product. I still had to know exactly what I wanted: the architecture, the Hasselblad-style interface, what "correct" even meant for a meter. The agent didn't decide the product. It executed a translation I could specify because I'd already built the thing once, wrong, and learned it cold. And I spent the next day chasing build errors and polishing the UI. The git log says so, plainly: "Fix build errors" is right there.</p><p>But here is the part that still gets me. The work I had been dreading, the weeks-long rewrite that was going to cost me a month of evenings I didn't have, happened between lunch and dinner.</p><h2>The thing that actually changed</h2><p>The port wasn't even the surprising part. The surprising part was the velocity <em>after</em>.</p><p>Within forty-eight hours of standing on native ground, I had added the LiDAR rangefinder through ARKit, true spot metering, real reciprocity math, film halation, and grain. Features that had felt like someday-maybe items behind the React Native bridge just started falling, one after another, because the tax I'd been paying on every single one was suddenly gone. The rewrite didn't save me a month one time. It changed the slope of everything that came after it.</p><p>For most of my career, the cost of re-platforming was the moat around a bad early decision. You picked the fast framework to get going, and then you were married to it, because tearing it out was a month you couldn't spare. So you lived with the ceiling. Agents collapse that cost. Changing my mind about the foundation of the app went from "a month, so no" to "an afternoon, so sure." That's not a productivity tweak. It quietly moves a whole class of decisions from irreversible to reversible, and reversible decisions are the ones you can afford to get wrong on the way to getting them right.</p><h2>What I'd actually tell you</h2><p>The agent is exactly as good as your ability to say what you want. It ported my app cleanly because I knew precisely what my app was. It would have just as happily ported my confusion. The skill that mattered that afternoon was not Swift, which I still barely know. It was knowing the product down to the pixel, and I only knew it that well because I had built the wrong version first and let it teach me.</p><p>Which is the same lesson the whole GlassMeter project keeps handing me. You don't get the shortcut until you've earned the map. The agent didn't replace the part where I had to understand the thing. It just made the understanding the only expensive part left.</p><p>The strange thing is that I build AI products for a living, and it took a hobby light meter to make this land. Next in the series: the lessons from this little film app that followed me all the way back to my day job.</p><div><hr></div><p><em>Have you let an agent re-pour the foundation of something real yet? I want to hear where it worked and where it bit you.</em></p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/using-antigravity-to-switch-from?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/using-antigravity-to-switch-from?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/using-antigravity-to-switch-from?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[From light to a print: how a photograph actually gets made]]></title><description><![CDATA[A companion to the GlassMeter series. The whole analog chain, start to finish, the way I actually do it: choosing film, metering the light, tripping the shutter, and turning a latent image into a print on the wall.]]></description><link>https://trond.ai/p/from-light-to-a-print-how-a-photograph</link><guid isPermaLink="false">https://trond.ai/p/from-light-to-a-print-how-a-photograph</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Mon, 06 Jul 2026 15:46:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DhMK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The <a href="https://trond.ai/p/i-built-a-light-meter-to-understand">GlassMeter posts</a> are about a light meter I built to understand metering. But a meter reading is only the first link in a long chain, and the rest of that chain is where film photography actually happens: chemistry, water, time, and a lot of working in the dark. This is the companion piece I kept wanting to write, the part where a number becomes a negative becomes a print you can hold.</p><p>I'll walk the whole thing end to end, using one frame as the example: the valley oak you saw in the GlassMeter post, the one with the big tree against a bright, cloud-streaked sky. It's a hard exposure and a harder print, which makes it a good teacher.</p><h2>1. Choosing the film</h2><p>I mostly shoot Ilford HP5 Plus or Kodak T-Max 400. I like a contrasty negative, and both push and pull well, so I have room to chase the light instead of being boxed in by it.</p><p>A quirk I've leaned into: I've bought a fair bit of 20-plus-year-old expired T-Max, and it shoots nearly the same as a fresh box. It wants a touch more exposure to make up for age, but not much. There's something satisfying about feeding decades-old film through a brand-new app and getting a clean negative out the other side.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DhMK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DhMK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DhMK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DhMK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DhMK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DhMK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:656485,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.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_!DhMK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DhMK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DhMK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DhMK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4568789-bee7-4d79-a304-9806f90894d7_1600x1200.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The bench. For this walk-through I&#8217;m shooting the Hasselblad 503CX.</em></figcaption></figure></div><h2>2. Metering and making the exposure</h2><p>I work off a tripod. I compose with the lens wide open, because that throws the most light onto the ground-glass screen and makes focus easier to see, and I use a magnifying loupe to confirm it's tack sharp. Then I pick the aperture I actually want, the one that puts the depth of field where I need 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_!b7Hk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b7Hk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b7Hk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b7Hk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b7Hk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b7Hk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg" width="1200" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:408126,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.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_!b7Hk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b7Hk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b7Hk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b7Hk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9330ce2e-7e0d-4c9b-8362-f34564302272_1200x1600.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Composing on the Hasselblad&#8217;s ground glass, wide open for a bright image. The loupe confirms focus before I do anything else.</em></figcaption></figure></div><p>Now the meter. I open <a href="https://trond.ai/p/i-built-a-light-meter-to-understand">GlassMeter</a> and match the composition in the finder, then I read the scene the Zone System way. I spot-meter a shadowed area where I want detail without it going muddy and place it on Zone IV, and I drop a pin there. I add a second pin on the brightest part of the scene and note how far apart the two readings are, so I know the contrast range I'm dealing with. I add a third on the darkest point. The exposure I trust is the one that holds those shadows at Zone IV, which is exactly what the app hands me.</p><p>I set that aperture in the app and check the rangefinder to see whether the depth of field matches what I pictured. If it doesn't, I adjust and look again. Then I lock the aperture, press meter, and the app gives me the shutter time. I dial it into the camera.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!co7d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!co7d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg 424w, https://substackcdn.com/image/fetch/$s_!co7d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg 848w, https://substackcdn.com/image/fetch/$s_!co7d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!co7d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!co7d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg" width="720" height="1565" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1565,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:259803,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.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_!co7d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg 424w, https://substackcdn.com/image/fetch/$s_!co7d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg 848w, https://substackcdn.com/image/fetch/$s_!co7d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!co7d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d74282e-4833-4c66-a08b-8ad276dbcfef_720x1565.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Metering in GlassMeter: spot a tone, read its zone, and place the shadows where I want them. This reading is the first link in the whole chain.</em></figcaption></figure></div><p>Then the ritual. I check the composition one more time, press the cable release, and wonder why nothing happened. Right: the dark slide is still in. I pull the dark slide, press the release again, and there's that satisfying <em>ker-chunk</em> as the leaf shutter fires and the film finally sees the scene. I advance the film and slide the dark slide back in. If the exposure runs longer than a second I'll use mirror lock-up to kill the vibration, but for a normal frame I don't bother.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>3. Loading the tank</h2><p>Developing starts in total darkness. We use plastic Paterson tanks, usually sized for two reels, which suits me because I tend to shoot more than one roll a session. There's a properly dark room, no safelight, where I pull the film off its spool and wind it onto the reels by feel.</p><p>That expired T-Max fights me a little here, because old film likes to stay curled, which makes it stubborn to seat on the reel. I can load by touch in complete darkness now, but it took real practice with a sacrificial roll to get there. It is a strange and good feeling, doing something delicate entirely by hand and feel, with your eyes useless.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OeFf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OeFf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OeFf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OeFf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OeFf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OeFf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:318185,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.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_!OeFf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OeFf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OeFf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OeFf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8748d53-feba-4bb0-b55b-7e81ccb17813_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The loading kit, a set per format: a 4&#215;5 film holder and its tank, a roll of 120 and its tank, a 35mm cassette and its tank, a can opener for cracking the 35mm cassette, and scissors. I lay it out, then kill the lights and load by feel.</em></figcaption></figure></div><h2>4. Developing the film</h2><p>Once the film is sealed in the tank, the lights come back on and it becomes a careful kitchen recipe.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OCtJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OCtJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OCtJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OCtJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OCtJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OCtJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:289556,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.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_!OCtJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OCtJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OCtJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OCtJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bf0fcb2-ec1c-46bc-aa61-a16842a1b727_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Two-reel Paterson tanks. With the film sealed inside, the rest happens in daylight, with a lot of shaking</em></figcaption></figure></div><p>For most of the class we were using <a href="https://www.freestylephoto.com/6172-Arista-Premium-Liquid-Film-Developer-64-oz.-(Makes-5-Gallons">Arista Premium</a>, Freestyle's liquid developer, which is widely understood to be a rebadged Clayton F76+. We run it at a 1:9 dilution, which makes it milder and more consistent than alternatives. At 68&#176;F, HP5 Plus runs 7:00 and Tri-X runs 6:30. Lately the tap water comes out closer to 70&#176;F, so we shorten the time a touch using a development chart rather than pretend the thermometer says what we wish it did.</p><p>The sequence is the standard archival one: developer, then a one-minute water bath, then fixer for five minutes, a water wash, three minutes in hypo-clear to pull the fixer back out, a long archival rinse, and finally a dip in Photo-Flo so the film sheets water instead of spotting. Agitation matters as much as time: thirty seconds at the start, then five seconds every thirty after that. Too much agitation and the contrast climbs; too little and you get uneven development. It is a feel you build by repetition.</p><h2>5. Drying</h2><p>In class we have a luxury: an industrial film dryer that takes the film from dripping to bone-dry in about forty minutes. I squeegee the excess water off between two fingers, hang the strips in the dryer, and forty minutes later they're ready. At home this step is an overnight affair in a dust-free bathroom, so the dryer feels like cheating in the best way. Once dry, the strips go into archival binder pages, which are what I'll proof from.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VjGd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VjGd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VjGd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VjGd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VjGd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VjGd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:389414,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.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_!VjGd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VjGd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VjGd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VjGd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F998b1113-c487-4335-bc42-deab42d1d764_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Dry negatives, sleeved and on the light table. The latent image is now a real, permanent thing.</em></figcaption></figure></div><h2>6. The contact sheet</h2><p>Before I commit good paper to a single frame, I make a contact sheet, a one-to-one proof of the whole roll, so I can see what I actually have.</p><p>It's made on the same Saunders/LPL enlargers we print with, using a full sheet of glass to press the negative pages flat against the paper. The method is a test strip first: raise the enlarger so the light covers the easel, open the lens to its brightest, and expose a thin strip of paper in stages, sliding a piece of cardboard along in three-second steps so I end up with a strip showing four or five different exposure times. I develop that, look at it in the light, and pick the time where the frames read best. Then I expose the full sheet at that time. We started the term on Ilford MGRC, the resin-coated paper, and have moved to Ilford Multigrade FB Classic, a glossy fiber paper, for the advanced class. The fiber is more expensive and fussier to handle, but the blacks are deeper and the print just looks better.</p><h2>7. Making the print</h2><p>This is where it stops being a recipe and starts being a craft.</p><p>I print on a Saunders/LPL 4&#215;5 enlarger, the diffusion-source workstation Foothill's darkroom is built around, and an 11&#215;14 sheet of Ilford Multigrade FB Classic is my favorite. The diffusion head matters: it spreads light more evenly than an old condenser enlarger, which means smoother tonal transitions and a little mercy on dust. I focus with a throwaway sheet in the easel and set the lens around f/16, two or three stops down from wide open, where it's sharpest.</p><p>For a scene like the oak, with detail spread across a wide tonal range, I print split-grade. The idea is to control highlights and shadows separately, using two different contrast filters, instead of compromising with one. First I put in the soft 00 filter and run a test strip in five-second steps over an area where I want highlight detail, the wispy clouds in the bright sky. That tells me the base exposure that holds the highlights. I lock that 00 time in.</p><p>Then I switch to the hard 5+ filter and run a second test strip, additive, meaning it lands on top of the 00 base I already chose. That dials in the shadows and the overall contrast. The final print is the sum of the two: a soft exposure for the gentle tones and a hard one stacked on top for punch. You can read the recipe right off this negative's sleeve.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RmOJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RmOJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RmOJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RmOJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RmOJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RmOJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:438660,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.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_!RmOJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RmOJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RmOJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RmOJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F362ee294-9560-48be-9fab-b456b95694de_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The oak&#8217;s printing recipe, in my handwriting: a 25-second base at grade 00, plus 9 seconds at 5+, a 10-second burn on the top right, all at f/16.</em></figcaption></figure></div><p>That "burn top R" is the last move, and it's the reason split-grade was worth it here. The sky was so much brighter than the tree that a straight print left the clouds blown out. So after the two base exposures, I give the top-right corner about ten extra seconds of light, holding back the rest of the print with my hands, to bring the clouds back without darkening the tree or muddying the print around it. Split-grade is an advanced technique, and it's overkill on an easy negative. It earns its keep on the hard ones, where you're trying to recover a sky and protect a subject in the same sheet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DDwV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DDwV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DDwV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DDwV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DDwV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DDwV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg" width="1200" height="1112" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1112,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:340563,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e6f974d-e032-4fba-8664-701ddec31c34_1200x1600.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_!DDwV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DDwV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DDwV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DDwV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc82df3-78e2-4d7c-bb33-52688fdb2e72_1200x1112.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>A print coming up in the developer tray. Watching the image appear in the dim safelight never gets old.</em></figcaption></figure></div><p>Fiber prints get their own processing run, longer and more patient than the film: two minutes in the developer, forty-five seconds in the stop bath, two minutes in the fixer, a three-minute pre-wash, five minutes in hypo-clear, and a twenty-minute final wash to get it truly archival. Then I squeegee it and lay it face-down on a drying rack. Fiber paper dries with a will of its own and curls as it goes, so the next day I flatten the finished prints in a print press. Only then is it done.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MCtL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MCtL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MCtL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MCtL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MCtL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MCtL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg" width="1180" height="1245" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1245,&quot;width&quot;:1180,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:251894,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F375b211e-fc45-4a0b-917c-52ba4777ca85_1200x1600.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_!MCtL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MCtL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MCtL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MCtL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d6382a-80fc-4dd8-82bc-db6ec27348b0_1180x1245.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Squeegeeing the oak print before it dries. Fiber curls as it dries, so flattening starts here and finishes in the press the next day.</em></figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!29bG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!29bG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!29bG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!29bG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!29bG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!29bG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:386676,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.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_!29bG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!29bG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!29bG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!29bG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf61a14e-f505-4be2-bd06-007406cdde3f_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The oak, printed and in hand. This is where the meter reading was always headed.</em></figcaption></figure></div><h2>Why do it the slow way</h2><p>You could ask, reasonably, why anyone does this in 2026 when a phone makes a perfectly good picture in a quarter second. The honest answer is the same one behind GlassMeter itself: doing the whole chain by hand is how you actually understand it. When you've placed the shadow on a zone, agitated the tank by feel, and burned a sky back in under a safelight, "exposure" and "contrast" stop being settings and start being things you have a relationship with.</p><p>That oak hangs on my wall now. It took a tripod, a meter I wrote, a tank loaded in the dark, a recipe of chemistry, and two filters' worth of light bent around my own hands. Every step is a place it could have gone wrong, which is exactly why getting it right feels like something.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iuNZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iuNZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iuNZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iuNZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iuNZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iuNZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3091693,&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://trond.ai/i/202812438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.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_!iuNZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iuNZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iuNZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iuNZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fdfd4b-7721-4ccd-b054-7162020ae9f1_4032x3024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The final Oak print after dry down and flattening.</figcaption></figure></div><div><hr></div><p><em>This is the companion to my GlassMeter series. If you want the app that handles the first link in this chain, it's on TestFlight at [glass-works.ai](https://glass-works.ai/testflight). And if you've got a darkroom, tell me how your process differs from mine.</em></p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/from-light-to-a-print-how-a-photograph?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/from-light-to-a-print-how-a-photograph?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/from-light-to-a-print-how-a-photograph?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[I built a light meter to understand light]]></title><description><![CDATA[A build-to-learn story: a dead light meter at a camera swap, a darkroom class, and nine months later, an iPhone app for film photographers.]]></description><link>https://trond.ai/p/i-built-a-light-meter-to-understand</link><guid isPermaLink="false">https://trond.ai/p/i-built-a-light-meter-to-understand</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 30 Jun 2026 15:26:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5L15!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fk-H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fk-H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Fk-H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Fk-H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Fk-H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fk-H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg" width="1200" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:565351,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff72af9b6-f991-48d2-ade9-14ce3b7560ef_1200x1600.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_!Fk-H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Fk-H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Fk-H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Fk-H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e0572d3-4277-44a2-86cb-d45b1c2c1bb3_1200x1600.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Me and the 4&#215;5 in Yosemite. High contrast, one sheet of film, and a scene I had no idea how to expose when this all started.</em></figcaption></figure></div><p>It started with a broken light meter.</p><p>I bought a <a href="https://en.wikipedia.org/wiki/Canon_AE-1">Canon AE-1</a> at a camera swap, a beautiful old 35mm SLR and one of the best-selling cameras ever made. It was cheap because the meter inside it was dead. No problem, I figured. I'd just meter the scenes myself.</p><p>Then I tried, and found I had no idea how. I knew the vocabulary of exposure (aperture, shutter, ISO) the way you know the words to a song in a language you don't actually speak. Handed a real scene and a camera that wouldn't tell me what to do, I froze.</p><p>So last September I signed up for <a href="https://foothill.edu/photo/">Darkroom I at Foothill College</a>: 35mm black-and-white film, trays of chemistry under a safelight, and the slow fundamentals. Load the tank in total darkness. Develop a roll. Make a print. My first prints came back muddy, flat shadows with no snap to them, and it was obvious the mistake hadn't happened in the darkroom. It happened out in the field, the moment I metered the scene and guessed at the light. I've shipped products at Google for eighteen years. I figured understanding metering would take a weekend.</p><p>So I did what I always do when I want to understand something for real. I built it.</p><h2>Build to learn</h2><p>This whole newsletter is named after the idea, so I won't belabor it: the fastest way I know to actually understand a system is to try to reconstruct it. Not read about it. Not watch a video. Build the thing, badly, and let it fail in all the specific ways that show you where your mental model was wrong.</p><p>A light meter looked like the perfect target. I had a dead one in my hands, for one. It's small enough to finish, and deep enough to hurt. And it sits right on top of a stack I'd wanted an excuse to learn anyway: the iPhone camera pipeline, real-time GPU rendering with <a href="https://developer.apple.com/metal/">Metal</a>, <a href="https://developer.apple.com/augmented-reality/arkit/">ARKit</a> and the LiDAR sensor, and the strange world of color science. Every one of those is a rabbit hole. A meter gave me a reason to climb down all of them with a clear question driving each descent.</p><p>The deal I made with myself was simple. It had to be good enough that I'd carry it into the field instead of my real meter. If I'd reach for it on a shoot, I understood the problem. If I wouldn't, I was kidding myself.</p><p>It took about nine months. The first commit is dated September 17, the week class started. As I write this it's on TestFlight as <strong><a href="http://glass-works.ai">GlassMeter</a></strong>, sixty-three commits and roughly eighteen thousand lines of Swift later. The reason I'm writing at all is that it finally cleared the bar. I reach for it first now, so it's time to let other people shoot with it.</p><h2>The first version was wrong, and that was the point</h2><p>I started in React Native, because that's where I was comfortable and I wanted to move fast. The app was called GroundGlass. It worked, sort of. It put a number on the screen.</p><p>It took about three weeks of fighting the camera through a bridge to realize the abstraction I'd chosen was the thing standing between me and the actual problem. A light meter lives or dies on what it can read off the sensor, frame by frame, in real time, and every layer between my code and that buffer was a place where the truth got rounded off. It had to be native Swift.</p><p>The switch happened the week <a href="https://en.wikipedia.org/wiki/Google_Antigravity">Google Antigravity</a> came out last November. I pointed it at the React Native project and asked it to port the whole thing to Swift. It did it in one shot: the entire app rebuilt natively in a single pass. That one made me sit back in my chair.</p><p>The rewrite was also the first real lesson of the project, and it had nothing to do with photography. It was about how often the tool you pick to go faster is the tool quietly deciding what you're allowed to learn.</p><blockquote><p>Build the thing, badly, and let it fail in all the specific ways that show you where your mental model was wrong.</p></blockquote><h2>Lesson one: your phone is lying to you on purpose</h2><p>The iPhone camera is a phenomenal piece of engineering whose entire job is to make every photo look good without you thinking about it. Face detection, Smart HDR, shadow lifting, local tone mapping. It is constantly, aggressively second-guessing the light in front of it.</p><p>That is exactly what you do <em>not</em> want in a light meter. A meter has to tell you the cold truth about the scene, including when the truth is "this is going to be a hard exposure." Point a stock iPhone at a night sky and it cranks the ISO to the moon and reports a brightness that is physically a lie.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bOsq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bOsq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bOsq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bOsq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bOsq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bOsq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg" width="720" height="1565" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1565,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:231026,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.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_!bOsq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bOsq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bOsq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bOsq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76512dd1-8240-4c3c-80f4-1567517f6bd0_720x1565.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The finder, mid-meter. The reading settles instead of hunting because the app is running its own exposure loop underneath, not trusting the phone&#8217;s.</em></figcaption></figure></div><p>So the core of GlassMeter is a custom exposure loop that switches the camera into fully manual mode and runs my own metering at 5 Hz. Every 200 milliseconds it grabs the raw pixel buffer, measures the actual luminance, and nudges ISO and shutter to pin the scene to <a href="https://en.wikipedia.org/wiki/Middle_gray">middle gray</a>, the same 18% value photographers have calibrated against for a century. From those hardware settings plus the residual error, it computes a scene EV that holds still instead of jumping around.</p><p>A detail that ate an entire evening: the iPhone sensor is mounted in landscape even when you're holding the phone in portrait, so every tap on the screen has to be rotated into sensor coordinates before you can sample the right pixels. Tap a shadow in the bottom-left of the finder and, without the transform, you'd be metering something off the side of the frame. Obvious in hindsight. Not obvious at 11pm.</p><p>There was a subtler call underneath all of it, too. When you average a whole scene, do you average the brightness values directly, or in stops? GlassMeter averages in log space (a geometric mean), so a bright window in the corner of a room doesn't drag the entire reading toward the highlights the way a naive average would. It meters the way your eye weighs a scene, not the way a spreadsheet would.</p><p>Getting that loop to hold still without oscillating came down to deadbands and gain, the same feedback-control tricks I'd reached for before in other corners of my work. What was new was what it taught me about the darkroom idea that a good meter "settles." I'd been treating that as poetry. It's a feedback loop.</p><h2>Lesson two: middle gray is 0.18, except when it's 0.46</h2><p>This is the bug I'm most fond of, because it's where the photography and the code turned out to be the same fact wearing two costumes.</p><p>I wanted the finder to show you the <em>photograph</em>, your chosen film and aperture and shutter, not just a number. So after metering, the image flows through a film simulation: a tone curve, color shifts, grain, the works. And it came out crushed and muddy, shadows everywhere.</p><p>Middle gray, in the linear light the math operates in, is 0.18. But the film color tables I was feeding it expected gamma-encoded <a href="https://en.wikipedia.org/wiki/SRGB">sRGB</a>, where middle gray sits around 0.46. I was handing the film stage a 0.18 and it was reading that as "deep shadow," so every midtone in every scene got shoved toward black.</p><p>The fix is one gamma-correction step in the right place. The reason I <em>understood</em> the fix is that this is the same 0.18 Josh Smith, who teaches my darkroom class, had me metering off a gray card to set exposure and calibrate the camera. The number that means "the middle of everything" is the same number whether you're standing under a safelight or staring at a Metal shader. Eighteen percent. I will never forget where middle gray lives, because I spent a Saturday debugging it in two places at once.</p><h2>Lesson three: film has opinions, and they're written down</h2><p>The part that ate the most time, and gave back the most, was making the film simulations honest.</p><p>It's easy to fake a film look. Slap on a preset, warm it up, add grain, ship it. That's not what I wanted. I wanted Tri-X to behave like Tri-X. So I went to the source: the actual datasheets that Kodak, Ilford, and Fuji publish for every stock, with their <a href="https://en.wikipedia.org/wiki/Sensitometry">characteristic curves</a> (the H&amp;D curves that plot how density responds to exposure), their reciprocity tables, their filter factors.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j29z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j29z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j29z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j29z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j29z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j29z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg" width="720" height="1565" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1565,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:138254,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.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_!j29z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j29z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j29z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j29z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf271be8-c50b-4b6d-b8ec-bcadfc0c0995_720x1565.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Thirty film stocks, each built from its real datasheet rather than a look-alike preset.</em></figcaption></figure></div><p>Each film in GlassMeter is built from its real published curve: Portra's long, gentle shoulder holding the highlights, T-MAX running nearly straight, slide film falling off a cliff in the shadows. Push HP5 to 3200 and the contrast steepens and the grain compounds the way a real push does, because the curve is doing real work, not a slider pretending to.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hTbD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hTbD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png 424w, https://substackcdn.com/image/fetch/$s_!hTbD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png 848w, https://substackcdn.com/image/fetch/$s_!hTbD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!hTbD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hTbD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png" width="1456" height="1144" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1144,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:213250,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.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_!hTbD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png 424w, https://substackcdn.com/image/fetch/$s_!hTbD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png 848w, https://substackcdn.com/image/fetch/$s_!hTbD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!hTbD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1fa245-99c8-49a1-be21-28979c105e4d_1577x1239.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Plotted straight from the app&#8217;s own curve data. Portra lifts the shadows and rolls off the highlights, T-MAX runs nearly straight, and Velvia climbs steeply with crushed blacks. Three films, three personalities, all from the datasheet numbers.</em></figcaption></figure></div><p>The reciprocity math is my favorite example of the datasheets paying off. Film loses sensitivity during long exposures, an effect called <a href="https://en.wikipedia.org/wiki/Reciprocity_(photography">reciprocity failure</a>), and every stock fails differently. I fitted a generalized version of the Schwarzschild law to each film's published correction table. The payoff: GlassMeter's Tri-X now matches Kodak's printed table to the stop, one extra stop at 1 second, two at ten, three at a hundred, while Acros II and Provia correctly <em>don't</em> start failing until you're two minutes into an exposure. The first time I watched the app add exactly the compensation the datasheet calls for, on a long exposure I was about to shoot, something clicked that no amount of reading had managed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!STzh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!STzh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png 424w, https://substackcdn.com/image/fetch/$s_!STzh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png 848w, https://substackcdn.com/image/fetch/$s_!STzh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!STzh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!STzh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png" width="1456" height="1144" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4323a45-87b7-4217-8846-e393d933156d_1577x1239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1144,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177749,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.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_!STzh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png 424w, https://substackcdn.com/image/fetch/$s_!STzh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png 848w, https://substackcdn.com/image/fetch/$s_!STzh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!STzh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4323a45-87b7-4217-8846-e393d933156d_1577x1239.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Metered time versus the time the film actually needs. Tri-X tracks Kodak&#8217;s published table to the stop, one stop at a second, two at ten, three at a hundred, while Acros II and Provia hold the line until about two minutes.</em></figcaption></figure></div><p>Then there was the bug I'll never live down. A batch of color films were rendering in full psychedelic Technicolor, skies going magenta and skin going green. The cause was two errors stacked on top of each other: I was reading the film's color table with the bytes in the wrong order <em>and</em> the color channels in the wrong order. The gray diagonal of the table happened to survive both mistakes, which is why grays looked fine and only colors scrambled, which is why it took me forever to find. The lesson there is older than photography. When the simple case works and the complex case explodes, suspect your assumptions about the data before you suspect your logic.</p><blockquote><p>The number that means "the middle of everything" is the same whether you're standing under a safelight or staring at a Metal shader.</p></blockquote><h2>The decision that made it mine</h2><p>Partway through, I'd gotten some of the film looks by decoding third-party color profiles. They worked. But they weren't mine, and shipping them as if they were didn't feel right.</p><p>So in June I deleted all of them and rebuilt every remaining film look from scratch, authored from the documented character of each stock rather than copied from someone else's profile. There's even a test that fails the build if any third-party profile sneaks back into the bundle. It cost me a week, and the app looks marginally different than it did. But every film look that ships is now original work, traceable to a published datasheet, and I can stand behind all of it.</p><p>That wasn't a coding decision or a legal decision. It was the instinct the darkroom drills into you: you own the print. Every choice in it is yours, on purpose, and you should be able to say why. Judy Walgren, who runs the photography department and has spent a career on the ethics of images, has a way of making that feel non-negotiable.</p><h2>The class kept writing the roadmap</h2><p>The course sequence turned out to be a curriculum for the app, too. Darkroom I was 35mm and the fundamentals. Darkroom II moved up to 120 roll film and medium format, and brought the <a href="https://en.wikipedia.org/wiki/Zone_System">Zone System</a>, push processing, and contrast filters with it. Each idea showed up in Josh's class and then, a week or two later, in the app. I never had to write a feature list. The syllabus was the feature list.</p><p>Medium format is where GlassMeter found its soul, and it's the format I built the app for. By then I'd bought a <a href="https://en.wikipedia.org/wiki/Hasselblad">Hasselblad</a> 503CX, a 6&#215;6 camera that, like the classic V-system bodies, has no meter at all. You compose on a ground-glass screen in the waist-level finder, you get twelve frames to a roll of 120, and you bring your own meter or you don't shoot. That's the camera GlassMeter is built to think like, down to the square-frame discipline, the Zeiss-style glass, and the Hasselblad-flavored metadata it writes into every file. I'd named the first prototype GroundGlass, after that focusing screen, before I owned the camera that made the name make sense.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KkHf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KkHf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KkHf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KkHf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KkHf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KkHf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:656485,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.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_!KkHf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KkHf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KkHf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KkHf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8814bb6b-24e9-4c34-a9cf-ec818b906e82_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The bench: a Hasselblad 503CX (left), a stack of 4&#215;5 sheet-film holders, and a Leica M6 (right). The Hasselblad has no meter at all; the M6 has one, but it&#8217;s wonky. Between the three of them, that&#8217;s the whole reason this app exists.</em></figcaption></figure></div><p>So the Zone System workflow is the real one. Spot-meter a shadow and pin it, spot-meter a highlight and pin it, and the meter places your exposure between them in log space, the shadow-and-highlight placement Adams taught and my instructor drills. As far as I can tell, no other phone meter does it properly. You can pin up to five readings and watch the app average them, exactly the way you'd reason through a tricky scene by hand.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4DSQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4DSQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4DSQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4DSQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4DSQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4DSQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg" width="720" height="1565" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1565,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:259803,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.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_!4DSQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4DSQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4DSQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4DSQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044e263d-158f-4ec0-96ec-631962c87cce_720x1565.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Spot a tone, read its zone, decide where you want it to land. The ruler is an Ansel Adams zone scale, not a generic histogram.</em></figcaption></figure></div><p>The app also shows you the scene's dynamic range live. Two markers track the darkest and brightest regions in the frame and report the spread in stops between them, and when the sensor clips, the meter says so plainly instead of pretending the spread is smaller than it is. That single readout has talked me out of more than one exposure I would have blown.</p><p>I've since moved up again. I'm in Darkroom III now, shooting 4&#215;5 large format, one sheet of film at a time under a dark cloth. It's the most deliberate photography there is, and the meter comes with me. But its heart is still the medium-format roll it was built for.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5L15!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5L15!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5L15!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5L15!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5L15!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5L15!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:466589,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.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_!5L15!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5L15!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5L15!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5L15!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0ae9133-16ba-45ff-aa8a-a5ae9e81e15b_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Shooting 4&#215;5 at Tunnel View. At this pace you meter every tone on purpose, which is exactly the workflow the app is built around.</em></figcaption></figure></div><h2>A meter that knows where things are</h2><p>A handheld meter has never been able to do this next part, because a chunk of glass in a leather case doesn't know how far away anything is.</p><p>GlassMeter uses the phone's LiDAR scanner as a rangefinder. Up close, LiDAR reads true distance to whatever you've metered. Past its range, your focus distance takes over on the same scale, and the app draws the near and far limits of your depth of field for the aperture you've dialed and the lens you've loaded. You can see, before the shot, exactly how much of the scene will be sharp.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aMsV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aMsV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aMsV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aMsV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aMsV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aMsV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg" width="900" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:162913,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.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_!aMsV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aMsV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aMsV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aMsV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ec2780-1020-421c-b601-c1c8fa518e86_900x900.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>LiDAR up close, focus distance beyond it, depth-of-field limits drawn for the aperture you&#8217;ve set.</em></figcaption></figure></div><p>This is the feature I'd never have guessed I'd build when I started. It exists because once I understood metering well enough to finish that part, the next question (how much of this will be in focus?) was sitting right there, and the sensor to answer it was already in my pocket.</p><h2>The glass has opinions, too</h2><p>The same datasheet honesty that went into the films went into the lenses. GlassMeter carries fifteen Zeiss V-system lenses, from the 30mm F-Distagon fisheye to the 500 Tele-Apotessar, and each one is built from its real published numbers: focal length, aperture range, true angle of view, minimum focus distance, filter thread, even which shutter it carries.</p><p>The most useful part is the simplest. Load a lens and the finder reframes to exactly what that lens sees. Put on the 250 Sonnar and the frame snaps to its real 13-degree field, and the meter reads only inside that crop. You end up metering the photograph you're actually going to take, not the wider scene your phone happens to be pointed at.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j-Cp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j-Cp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png 424w, https://substackcdn.com/image/fetch/$s_!j-Cp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png 848w, https://substackcdn.com/image/fetch/$s_!j-Cp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png 1272w, https://substackcdn.com/image/fetch/$s_!j-Cp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j-Cp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png" width="1654" height="1476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1476,&quot;width&quot;:1654,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2033939,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5daa974f-504e-4bca-995c-7c8ed1177425_1654x1556.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_!j-Cp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png 424w, https://substackcdn.com/image/fetch/$s_!j-Cp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png 848w, https://substackcdn.com/image/fetch/$s_!j-Cp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png 1272w, https://substackcdn.com/image/fetch/$s_!j-Cp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c429e-d015-4b97-b93e-a056ffdbfe22_1654x1476.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Load a lens and the finder crops to its true field of view, then meters only inside it. Here the real Zeiss angles of view are laid over one of my own frames: the whole field at 38mm, down to a tight crop on the canopy at 500.</em></figcaption></figure></div><p>From there the small stuff piles up the way it does on real glass. Each lens vignettes at the edges wide open and cleans up as you stop down, modeled in linear light so the falloff behaves. Each one loses a little light passing through, so a fast lens reads a hair slower than its f-number promises, and that loss is folded into the exposure. And each has its own bloom: the Planar FE 2/110 is the system's glow lens, with a visible halo wide open at f/2, while the 100 Planar is corrected so well it barely blooms at all. That character then gets multiplied by the film's own halation, so an 800T frame through the 110 glows very differently than Acros through the 100.</p><p>One honest caveat, since I'm keeping a list of those: Zeiss never published per-lens vignetting curves for the V system, so that single number is a heuristic from focal length and speed rather than a measured falloff. Everything else traces to a data sheet.</p><h2>One frame, the long way</h2><p>Here is what all of that machinery actually feels like in the field, on a frame you've already seen in this piece: the valley oak.</p><p>I set the camera on the tripod and point the phone at the scene. I spot-meter the deep shadow under the canopy and pin it, then the bright dry grass in the sun and pin that too. Both readings land on the zone ruler with the spread between them, and on a high-contrast afternoon the app tells me plainly that the range is wider than the film will hold cleanly. So I make the call every film photographer makes: I place the shadow on Zone III, dark but still holding texture, and the meter sets the exposure to put it exactly there. Now I know where the highlights will fall, and how much of the sky will blow, before I have spent a single sheet.</p><p>I want the trunk crisp and the far ridge soft, so I read the depth-of-field limits the rangefinder draws for the aperture and the lens I've loaded, and stop down until the near edge of sharpness reaches the grass. The light is going, and the exposure runs long, past a second, so the app folds in the film's reciprocity correction and counts the bulb exposure down in my hand with haptic taps. I trip the shutter, hold it open until the count ends, and that is the frame.</p><h2>The notebook that keeps itself</h2><p>Film never recorded its own settings. You scribbled them in a notebook or you lost them forever, and most of us lost them. By the time you've developed the roll and you're hanging the negatives up to dry, you can't remember whether that frame was f/8 or f/11, or which filter was on the lens.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ap-R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ap-R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ap-R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ap-R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ap-R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ap-R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:438660,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.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_!Ap-R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ap-R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ap-R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ap-R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da5a1de-05a6-4a20-a1e2-0c7f6e6eaa8f_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Darkroom bookkeeping: the printing recipe for this oak negative scrawled on its sleeve. Split-grade base exposure, a burn on the top right, all at f/16 under the enlarger. GlassMeter can&#8217;t make the print for you, but it keeps the other half of this record, the camera exposure, automatically.</em></figcaption></figure></div><p>Every frame GlassMeter captures carries its full exposure record into the file's metadata: film, lens, aperture, shutter, ISO, push or pull, even the individual spot readings you pinned. The notebook I always meant to keep, kept automatically.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DGov!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DGov!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DGov!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DGov!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DGov!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DGov!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg" width="1100" height="740" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:740,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37372,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.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_!DGov!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DGov!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DGov!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DGov!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7b1ed6-ca2e-4c65-abcc-345179ffaaed_1100x740.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Every capture remembers how it was made. You can also share a frame as a contact-sheet cell, edge markings and exposure data included.</em></figcaption></figure></div><p>You can share a frame two ways: as the photo, or as a little contact-sheet cell with film-edge markings and your exposure data printed alongside it, the way a real proof sheet looks. It scratches the same itch as labeling your negatives, minus the part where you never actually do it.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>The details that don't photograph well</h2><p>Plenty of the nine months went into work that will never show up in a screenshot.</p><p>There's a bulb-mode timer that counts your long exposure down in your hand with haptic taps, the film's reciprocity correction already folded into the recommended time. That one is pure darkroom-class wish fulfillment.</p><p>The aperture and shutter dials have haptic detents you can feel, and you can lock one to shoot aperture-priority or shutter-priority, the way the dials on a real body work. Press the meter button and the unlocked dial solves itself.</p><p>The filters are honest, too. Yellow 8, Green 11, Orange 21, Red 25, each with <a href="https://en.wikipedia.org/wiki/Wratten_number">Kodak's published Wratten factors</a> and a spectrally-derived color response, so a red filter really does drive a blue sky toward near-black the way it does on real B&amp;W film.</p><p>And then there's the unglamorous stuff that makes an app feel finished. The whole thing is localized into 34 languages. It sheds frame rate and effects when the phone gets hot, and pauses rendering entirely when a menu covers the finder, because your battery is part of the design. None of that is exciting to describe. All of it is the difference between a demo and a tool.</p><h2>The stack, in the end</h2><p>Nine months in, this is what the side quest actually taught me, beyond photography. Real-time GPU rendering in Metal, where the live finder and the final capture run the exact same 16-bit, <a href="https://en.wikipedia.org/wiki/DCI-P3">wide-gamut</a> image pipeline so that what you see really is what you get. ARKit and depth sensing. A pile of color science I'd never have learned from a tutorial, because I'd never have had a reason to care. And a fresh respect for how much deliberate engineering goes into the camera in your pocket pretending to be effortless.</p><p>I also made a decision I'm quietly proud of. GlassMeter collects nothing. No account, no analytics, no servers, no network calls of any kind. The <a href="https://glass-works.ai/privacy">App Store privacy label</a> reads "Data Not Collected" because there is, truly, nothing to collect. The most interesting thing a light meter could ever phone home is nothing.</p><h2>A few thanks</h2><p>I didn't get here on my own. <a href="https://www.instagram.com/joshgrantsmith/">Josh Smith</a> teaches the darkroom classes I've been taking at Foothill since last fall, and he's the reason I started shooting film seriously in the first place. He's a working photographer and a patient teacher, and he also teaches photography at <a href="https://www.eastside.org/">Eastside College Prep</a> in East Palo Alto. <a href="https://www.instagram.com/judywalgren/">Judy Walgren</a> runs <a href="https://foothill.edu/photo/">Foothill's photography department</a>; she's a Pulitzer Prize-winning photojournalist and a former director of photography at the San Francisco Chronicle, and her advice, on the pictures and on everything around them, has shaped how I think about all of this. Both of them have been generous with their time and their eye throughout this project, and patient with a software guy who kept turning up to class wanting to talk about exposure math. Thank 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_!Fu3J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fu3J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Fu3J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Fu3J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Fu3J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fu3J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg" width="1200" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:340274,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.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_!Fu3J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Fu3J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Fu3J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Fu3J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e076b8-cb1d-4953-b0ce-ee426c7e4625_1200x1600.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Josh, mid-critique. Half of what I learned about seeing a print happened in this room.</em></figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H4Tp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H4Tp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!H4Tp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!H4Tp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!H4Tp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H4Tp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:307496,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.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_!H4Tp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!H4Tp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!H4Tp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!H4Tp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb09b195a-3594-4285-943d-54046a8fb9fd_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Judy sharing her depth of photography expertise during one of our class project critiques.</em></figcaption></figure></div><h2>Where it's still wrong</h2><p>I'd rather be straight about the limits, because a meter you trust blindly is worse than no meter.</p><p>It's a phone, not a dedicated spot meter. In bright sun the screen washes out, the battery drains under the rendering pipeline, and it slows itself down when it gets hot. For critical work I still sanity-check it against my handheld, and you should too.</p><p>Incident metering is an approximation. A real incident meter has a diffusing dome with known optics; the phone's front camera doesn't, so I model the diffusion instead of measuring it. It lands close, but it still wants a calibration pass against the real thing.</p><p>And some of the film numbers are educated guesses. Manufacturers only publish their reciprocity tables so far. Past a second or two, the color-negative corrections are extrapolated rather than measured, because Kodak and Fuji simply don't print them. I flag those in the app's engineering notes rather than pretend they're gospel.</p><p>None of that is false modesty. It's the list I'm hoping the beta helps me shorten.</p><blockquote><p>The most interesting thing a light meter could ever phone home is nothing.</p></blockquote><h2>Why I'm sharing it now</h2><p>I built this for me. For most of its life it was a tool with exactly one user, tuned to exactly one person's confusion about exposure. The bar I set was selfish: would I carry it into the field instead of my real meter? For a long stretch the answer was no, and that no was the to-do list.</p><p>Somewhere this spring the answer flipped. Now it's the first thing I reach for when I'm standing in front of a scene trying to decide where to put the shadows. That's the whole signal I was waiting for.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9sII!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9sII!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9sII!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9sII!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9sII!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9sII!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:584631,&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://trond.ai/i/202690912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.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_!9sII!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9sII!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9sII!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9sII!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0741c44-1a3a-450e-99d8-26c8b8d94601_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>A valley oak, shot on film and printed this term in the Foothill darkroom. This is the part the meter is in service of.</em></figcaption></figure></div><p>So it's on TestFlight, and you're invited. If you shoot film, or you've ever wanted to actually understand what a light meter is telling you instead of just trusting it, I'd love for you to break it and tell me where it's wrong. There's a feedback button right in the app. What I most want to hear: where the meter disagrees with your handheld, and which film looks feel off to people who have shot them for years. If the beta holds up, the App Store is the next stop.</p><p>You can join the beta at <strong><a href="https://glass-works.ai/testflight">glass-works.ai</a></strong>.</p><p>And if there's a system you've been circling for a while, half-understanding it from the outside: pick the small, deep version of it and build the thing. Let it fail at you. You'll never read middle gray the same way again.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/i-built-a-light-meter-to-understand?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/i-built-a-light-meter-to-understand?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/i-built-a-light-meter-to-understand?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Build the travel app you've always wanted]]></title><description><![CDATA[For years I've built a complex travel doc to organize the logistics of summer travel. This year I converted it into a rad travel app on a Saturday afternoon.]]></description><link>https://trond.ai/p/build-the-travel-app-youve-always</link><guid isPermaLink="false">https://trond.ai/p/build-the-travel-app-youve-always</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 23 Jun 2026 21:38:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fRvJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every summer, before the big family trip, I make <em><strong>The Doc</strong>.</em></p><p>You might make one too. It's a Google Doc with a table. Flights up top, then hotels, then a row for every day: what's booked, the confirmation codes, who's going where and when. I hand a copy to my wife at the airport and it becomes the bible for the trip. In 2024 it ran us through the Croatian islands: Dubrovnik, Kor&#269;ula, Split, a ferry every couple of days. In 2025 it ran Japan: Tokyo to Kyoto, a samurai lesson, a hedgehog caf&#233;. This year it's a run through Boston, Croatia, Italy, France, and Maine. <em><strong>The Doc</strong></em> quickly gets messy.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9s9x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9s9x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png 424w, https://substackcdn.com/image/fetch/$s_!9s9x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png 848w, https://substackcdn.com/image/fetch/$s_!9s9x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png 1272w, https://substackcdn.com/image/fetch/$s_!9s9x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9s9x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png" width="1320" height="2315" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2315,&quot;width&quot;:1320,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:435646,&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://trond.ai/i/203278454?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.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_!9s9x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png 424w, https://substackcdn.com/image/fetch/$s_!9s9x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png 848w, https://substackcdn.com/image/fetch/$s_!9s9x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png 1272w, https://substackcdn.com/image/fetch/$s_!9s9x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22b909aa-0efd-4617-95b5-43afa766fb35_1320x2315.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Section of our travel doc for 2024. Don&#8217;t laugh, that Hootie concert was a ton of fun!</figcaption></figure></div><p>Nevertheless <em><strong>The Doc</strong></em> works, but its kind of a tyrant. Every year it gets longer and smarter and harder to use. More links, more "<em>[!] needs attention</em>" flags, more places where the one thing you need <em>right now</em> is buried on page nine. This spring I caught myself building three competing layouts for the daily planner and labeling them, with no irony, FORMAT A, FORMAT B, FORMAT C.</p><p>That's when it clicked: I didn't want a better version of <em><strong>The Doc</strong></em>. I wanted something richer, more informative, and a little easier to navigate. What I wanted was an app. I&#8217;ve tried a bunch of apps theoretically made to do this, but none really worked for me.</p><p>So I built the one I wanted.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fRvJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fRvJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!fRvJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!fRvJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!fRvJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fRvJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png" width="1206" height="2622" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2622,&quot;width&quot;:1206,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4074719,&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://trond.ai/i/203278454?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e1fd3c6-43c1-40a4-814f-6679e4c9cd84_1206x2622.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_!fRvJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!fRvJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!fRvJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!fRvJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a3d6bc-9171-4ff8-8bab-2ea7c2c18b28_1206x2622.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The Today screen mid-trip in Verona, with saved PDF of our tickets to Aida at the Arena. Hidden here so you don&#8217;t see the barcode!</figcaption></figure></div><p>I didn't have to do manual iOS development to make this. That's the whole point. I built it using Antigravity the way you'd work with a sharp junior developer. I described what I wanted, in plain English, and my agents did the coding. <em>(I used a mixture of agents including my home agent, Stella, who regular readers have met.)</em> <em><strong>The Doc</strong></em> a real native app now, on my phone and my wife's. Mostly vibe-coded, but all mine. I guided and the tools built.</p><p>The bar for building things you just want for yourself is so much lower than you think. And the ceiling higher. Getting started is easy, crafting excellence takes time.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>What <em>The App</em> actually does</h2><p><em><strong>The App</strong></em> knows what day it is. Open it on June 23rd <em>(that&#8217;s today!)</em> and it reminds me of the flight that I&#8217;m currently on. Open it on July 1st in Verona and the first thing you see is a reminder about our tickets to <em>Aida</em>, a map to the Arena with a link to a saved PDF of the ticket, and my note to "bring a seat cushion.&#8221; Open it on a travel day and it leads with your next transfer, a link to the train booking site and instructions on how to purchase tickets. The same screen quietly rearranges as the trip unfolds, adapting as needed to new information. (<em>Remember, I wrote a whole post about <a href="https://trond.ai/p/2026-is-the-year-of-just-in-time">just-in-time UX being the thing for 2026</a>.</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_!byY7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!byY7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!byY7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!byY7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!byY7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!byY7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png" width="1206" height="2622" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2622,&quot;width&quot;:1206,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2745229,&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://trond.ai/i/203278454?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.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_!byY7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!byY7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!byY7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!byY7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30e4e325-1ffa-4203-913b-071895d584e4_1206x2622.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Today, its reminding me to get on the flight I&#8217;m on right now.</figcaption></figure></div><p>Every day you also get the weather forecast, suggestions for meals and a selection of relevant phrases in the local language along with pronunciation audio. Hilariously, the AI added a phrase guide for Boston including: Wicked, Pisser and Packie. All useful phrases for the kids to learn for the camp bus tomorrow. Maybe the adults will hit a Packie after we drop the kids off.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NOYb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NOYb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!NOYb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!NOYb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!NOYb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NOYb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png" width="1206" height="2622" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2622,&quot;width&quot;:1206,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4792012,&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://trond.ai/i/203278454?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.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_!NOYb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!NOYb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!NOYb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!NOYb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d71b717-dcee-42d9-b755-6e2f8919f3fb_1206x2622.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">City list view of each stop on the trip</figcaption></figure></div><p><em><strong>The App</strong></em> has several touches that I really wanted in my app. It creates a detailed city guide for each place with useful information including a live map with your hotel marked, a brief about the history of the city, summaries of what it's known for, hints about local etiquette like tipping customs, relevant emergency numbers, and a selection of restaurants filtered so my wife <em>(who doesn't eat seafood)</em> never gets pointed at an oyster bar. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qQd7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qQd7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!qQd7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!qQd7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!qQd7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qQd7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png" width="1206" height="2622" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2622,&quot;width&quot;:1206,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3787251,&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://trond.ai/i/203278454?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.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_!qQd7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!qQd7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!qQd7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!qQd7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa9f46c2-2ee6-4344-8944-7abf006d2270_1206x2622.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">City detail page for our stop in Rovinj </figcaption></figure></div><p>Since I work on NotebookLM, my favorite part <em>(obviously)</em> is that every city has it&#8217;s own podcast. I had the <a href="https://trond.ai/p/notebooklms-execution-stack">NotebookLM agent</a> research the history, pull in the most relevant sources, and generate an audio briefing about the city. Little documentary-style episodes that ride in your pocket and play offline, right on the lock screen, while you walk around and explore a new place.</p><p>Here&#8217;s a small taste of Rovinj's audio briefing, "<em>The Venetian Island That Became a Peninsula</em>":</p><div class="native-audio-embed" data-component-name="AudioPlaceholder" data-attrs="{&quot;label&quot;:null,&quot;mediaUploadId&quot;:&quot;db1ba1b3-8287-427c-a60c-d55ceb489df2&quot;,&quot;duration&quot;:180.03592,&quot;downloadable&quot;:false,&quot;isEditorNode&quot;:true}"></div><p>There's one catch: making those podcasts is the only step in this whole system I still do by hand. The notebook agent does the research and the generation; I'm just the one clicking through it, city by city. The day there's a NotebookLM MCP or API, this manual step can go away and the trip's audio will generate itself. (<em>I'm choosing to hear that as a feature request. You're welcome, future me.</em>)</p><p>A few more things <em><strong>The Doc</strong></em> could never do safely. It scans our passports and keeps the information in the iPhone&#8217;s secure storage: point the camera, and it reads the little machine-readable strip at the bottom and fills in the traveler information, while the photo itself never leaves the phone. The sensitive stuff stays sensitive, since passport numbers and document scans live behind Face ID in the iOS Keychain and never touch the network. </p><p>Both phones stay in sync without handing the cloud anything readable: when I update the trip back home, both phones pull the change, but the server only ever sees encrypted gibberish. The passphrase lives on our devices and nowhere else. Zero-knowledge sync, for a literal family vacation. Overkill? Maybe. I&#8217;ve never been accused of doing things half-assed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PVR0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PVR0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png 424w, https://substackcdn.com/image/fetch/$s_!PVR0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png 848w, https://substackcdn.com/image/fetch/$s_!PVR0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png 1272w, https://substackcdn.com/image/fetch/$s_!PVR0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PVR0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png" width="1206" height="740" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:740,&quot;width&quot;:1206,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51099,&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://trond.ai/i/203278454?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddc94d0-3dc2-4209-bc34-2360d35ce615_1206x2622.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_!PVR0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png 424w, https://substackcdn.com/image/fetch/$s_!PVR0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png 848w, https://substackcdn.com/image/fetch/$s_!PVR0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png 1272w, https://substackcdn.com/image/fetch/$s_!PVR0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5624ba24-ffde-45d9-968b-114e9dceb099_1206x740.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The lock screen between you and your securely stored local documets</figcaption></figure></div><h2>The messy middle</h2><p>I don't want to lie to you and tell you making this was a totally frictionless experience. Building with AI is mostly iteration, and the bugs are real and occasionally hilarious or annoyingly sticky.</p><p>It took me forever to get the agent to do a reasonably good job with the Liquid Glass styling and to get the padding right for the edges and cards in the experience. Almost as frustrating as debugging CSS, but maybe a bit more complex. I guess there isn&#8217;t enough training data on the liquid glass design system yet. </p><p>Content can be misunderstood as well. At one point an agent reading a rental-car confirmation dropped Portland International Airport, the one in Oregon, into a trip that goes nowhere near it. Two Portlands. Classic. </p><p>For awhile the app crashed every single time you hit play on a podcast, because the lock-screen artwork was rendering on the wrong thread. A genuine Swift concurrency gremlin that took reading an actual crash log to pin down. And a real chunk of my commit history is just me sanding the tells off the machine-generated UI until it stopped looking AI-built and started looking hand crafted.</p><p>None of that required me to use my computer science degree. It required me to be stubborn and curious enough to keep going. That's the actual work now &#8212; bring your ideas, your sense of taste, and don&#8217;t quit until you like it.</p><h2>Where I'm landing (and a question)</h2><p>Technically, we still have about an hour before we land in Boston. But on my mind is a question: How low is the floor for making something? "I wish this were an app" used to be the end of the sentence: a wistful thing you said and then didn't do. It isn't anymore. If you've got a real problem you actually care about and you're willing to iterate, you can build a tool that solves your problem. Not someday. This weekend.</p><p>Which brings me to something I'd love your read on:</p><p>The engine under this app is already generic. I built it so the trip is just a simple json data structure with one file and a folder of screenshots. Each unique trip is a different file; the app itself doesn't change, it just points to a different source of truth. Which means I'm basically one onboarding flow and a hosting system away from being able to let other people try it: point it at your upcoming trip doc, and have <em><strong>The App</strong></em> make your own custom version to take with you.</p><p>Should I? Is this a rad thing to share, a little app to fill with your own trip? Or is it the kind of personal tool that's better left personal? I made it for me, but maybe it&#8217;s good enough to share?</p><p>Reply and tell me. And if you've been sitting on your own "I wish this were an app," consider this your sign. Go build the rad thing. I want to hear about it.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/build-the-travel-app-youve-always?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/build-the-travel-app-youve-always?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/build-the-travel-app-youve-always?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[NotebookLM’s execution stack]]></title><description><![CDATA[Extending NotebookLM to support grounded execution.]]></description><link>https://trond.ai/p/notebooklms-execution-stack</link><guid isPermaLink="false">https://trond.ai/p/notebooklms-execution-stack</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Thu, 18 Jun 2026 15:14:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mjz4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mjz4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mjz4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!mjz4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!mjz4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!mjz4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mjz4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png" width="2752" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:2752,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4218782,&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://trond.ai/i/202594573?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5262355a-c0db-4c34-8d99-ef83c96543f4_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mjz4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!mjz4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!mjz4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!mjz4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca12e37-a252-477e-befe-96663fbfc3e3_2752x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Last week, we announced a <a href="https://blog.google/innovation-and-ai/products/notebooklm/better-research-notebooklm/">significant update to NotebookLM</a> with the addition of an integrated cloud computer for each notebook. The announcement focused on how it helps users go deeper with research and do more within notebooks, which is the right way to frame an announcement on a large-scale Google blog. There, we&#8217;re speaking to a broad audience spanning press, users, and influencers interested in keeping tabs on what&#8217;s new at Google.</p><p>Here on my personal Substack I have a bit more editorial license, so I wanted to share a bit more about why I&#8217;m so personally excited about this update. It boils down to one question: what changes when a research tool stops being just a place to ask questions and also becomes a place where work actually happens? That is the part I find interesting here. NotebookLM is becoming a place to do real work, grounded in information you trust.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>A fundamental architecture shift</h2><p>With these changes, NotebookLM now has a more explicit execution layer. Everything remains rooted in source grounding, but it can now route work into a dedicated runtime, choose between direct reasoning and tool use, and return structured artifacts instead of only text. That is a bigger deal than it sounds. Once you separate planning from execution, you stop forcing one model call to do every job in the stack.</p><p>For most of its life, NotebookLM did all of that in a single model call that read your sources, reasoned, and answered, all inline. Underneath this launch, the same work now flows through three distinct layers:</p><ol><li><p><strong>Grounding.</strong> The work stays anchored to sources you provided or approved, exactly as it always has, and it remains the foundation everything else sits on.</p></li><li><p><strong>Orchestration.</strong> The model decides what the task actually needs, whether that&#8217;s a direct answer, a prebuilt skill, or some custom code, and routes it accordingly.</p></li><li><p><strong>Execution.</strong> The chosen path runs in a dedicated cloud environment and hands back a finished artifact, not just text.</p></li></ol><p>The cleaner that contract between layers, the more capability we can add without the whole thing turning into a brittle prompt chain, with no single model call stuck being analyst, formatter, and renderer all at once.</p><h2>The cloud computer behind the notebook</h2><p>The most interesting piece is that execution layer. In practical terms, it&#8217;s a dedicated virtual machine with a set of skills the agent harness can reach for. Gemini can either write bespoke code for a one-off task, or call a pre-made skill that already knows how to produce a given type of file.</p><p>What changes here is that the model no longer has to improvise an entire workflow in one shot. It can choose a path and then delegate, which moves the interesting design question from &#8220;can it answer?&#8221; to &#8220;how well does it decide what to do?&#8221; An analytical task can drop down into code, a repetitive one can hand off to a skill that has done it before, and a request for a structured artifact can be packaged into the right format, with each one routed deliberately rather than crammed into a single response.</p><p>That deliberate routing buys repeatability as much as flexibility. When the same class of task gets handled the same way each time, you get something you can build a workflow on top of, rather than a result that happens to impress you once and then behaves differently the next time you ask.</p><div><hr></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>What the runtime can produce</h2><p>There&#8217;s more inside that environment than you might expect. Instead of a thin wrapper that knows how to emit a handful of file types, it&#8217;s a genuine computer with a real toolchain. There&#8217;s a full data stack (<a href="https://github.com/pandas-dev/pandas">pandas</a>, <a href="https://github.com/pola-rs/polars">polars</a>, <a href="https://github.com/duckdb/duckdb">DuckDB</a>), proper modeling libraries for when a task needs them (<a href="https://github.com/scikit-learn/scikit-learn">scikit-learn</a>, <a href="https://github.com/dmlc/xgboost">XGBoost</a>, <a href="https://github.com/pytorch/pytorch">PyTorch</a>, <a href="https://github.com/statsmodels/statsmodels">statsmodels</a>), and rendering for nearly anything you&#8217;d want out the other side: <a href="https://github.com/matplotlib/matplotlib">matplotlib</a>, <a href="https://github.com/plotly/plotly.py">Plotly</a> and <a href="https://github.com/mwaskom/seaborn">seaborn</a> for charts; <a href="https://github.com/python-openxml/python-docx">python-docx</a>, <a href="https://github.com/scanny/python-pptx">python-pptx</a> and <a href="https://foss.heptapod.net/openpyxl/openpyxl">openpyxl</a> for Office files; <a href="https://www.reportlab.com/">reportlab</a> and a <a href="https://www.latex-project.org/">LaTeX</a> toolchain for typeset PDFs. It can OCR a scanned document (<a href="https://github.com/tesseract-ocr/tesseract">Tesseract</a>), pull tables out of a messy PDF (<a href="https://github.com/jsvine/pdfplumber">pdfplumber</a>), work with audio and video (<a href="https://github.com/FFmpeg/FFmpeg">ffmpeg</a>, <a href="https://github.com/librosa/librosa">librosa</a>, <a href="https://github.com/Zulko/moviepy">moviepy</a>), do geospatial work (<a href="https://github.com/geopandas/geopandas">GeoPandas</a>, <a href="https://github.com/shapely/shapely">Shapely</a>), and reach for domain-specific libraries like <a href="https://github.com/lballabio/QuantLib">QuantLib</a> for finance or <a href="https://github.com/pydicom/pydicom">pydicom</a> for medical imaging when a notebook calls for it.</p><p>I&#8217;m listing names on purpose, because the breadth <em>is</em> the point. The skills sitting on top of that stack are reusable capability modules shaped around tasks rather than file formats, and they cluster into a handful of things that matter:</p><ul><li><p><strong>Code execution:</strong> the backbone. It lets NotebookLM move from <em>summarizing</em> a source to <em>analyzing</em> it, computing metrics, testing assumptions, and surfacing patterns a plain-text response never could.</p></li><li><p><strong>Web research and source discovery:</strong> for when you start with a loose idea instead of a finished source set, and need the system to go find and organize the material first.</p></li><li><p><strong>Documents and reports:</strong> <code>pdf</code>, <code>docx</code>, and markdown, the briefs and writeups where most real work actually lands.</p></li><li><p><strong>Charts and visualization:</strong> generated straight from the analysis, so the visual stays tied to the source instead of being rebuilt by hand somewhere else.</p></li><li><p><strong>Spreadsheets and structured exports:</strong> <code>xlsx</code>, <code>csv</code>, and <code>json</code>, the bridge from a notebook answer into scripts, dashboards, and whatever&#8217;s downstream.</p></li><li><p><strong>Presentations:</strong> <code>pptx</code>, turning source material into a communicable narrative without rebuilding the structure from scratch.</p></li><li><p><strong>Images:</strong> diagrams and supporting visuals (yes, Nano Banana) for when the work needs more than text.</p></li></ul><p>What ties these together is that NotebookLM can now choose a file, a chart, a deck, or a structured export as the appropriate response to a given task, instead of leaving you to export and reformat everything by hand afterward. Plenty of tools can generate something that looks finished, but far fewer can do it while keeping the result tied back to the sources it came from, and that tie is the part I care about most.</p><h2>What people actually did with it</h2><p>I don&#8217;t have to speculate about the use cases, because I&#8217;ve now watched the first wave of real sessions come through, and the pattern is clearer than any roadmap deck. Two patterns in particular stood out to me.</p><p>The first is that people aren&#8217;t mostly coming to ask what their sources say. They&#8217;re coming to make something out of them, and that creative use is where the center of gravity sits: people doing real work in a long tail of languages, not running through a demo in English.</p><p>The second is how varied that work is. Here are a few representative examples of the sorts of things people can now do:</p><ul><li><p>a law lecturer turning a dense set of property statutes into a structured graduate-seminar lecture</p></li><li><p>an analyst uploading a stack of quantitative-finance textbooks, then having the system test trading signals derived from market-positioning data</p></li><li><p>an instructor handing over a grading rubric and a batch of student assignments, and getting back a scored, formatted spreadsheet</p></li><li><p>someone turning a single research topic into a short video script, a slide deck, <em>and</em> a companion podcast, all in a language other than English</p></li><li><p>a reader sorting a pile of tech-conference announcements into clean thematic buckets</p></li></ul><p>None of those is a &#8220;summarize my PDF&#8221; request. They&#8217;re people using NotebookLM to do the next step of the work, and in each case the whole thing stayed inside one grounded environment, which meant fewer tool switches, fewer places for the workflow to break, and an output that still traced back to the sources.</p><p>It&#8217;s changing the question people bring to the product, too, shifting from <em>&#8220;What do these sources say?&#8221;</em> toward <em>&#8220;What should this become?&#8221;</em></p><h2>Why this is the right shape</h2><p>I&#8217;m betting on this direction because the division of labor finally feels right. NotebookLM stays grounded, which is non-negotiable, but the contract underneath is cleaner now: the model handles intent, the runtime handles execution, and the skills handle repeatable output. New capability slots into an existing layer instead of getting bolted onto the side.</p><p>Grounding is also what makes the execution layer credible in the first place. Once a product starts producing charts, spreadsheets, and decks, the thing readers need to trust is that those outputs still reflect the source, and faithful grounding is what NotebookLM has been built around from the beginning. Take it away and you&#8217;re left with another chatbot generating confident-looking files.</p><p>We&#8217;re early here, and not every routing decision will be right yet. But the architecture is the part I find most exciting. The system now has a real shape for turning knowledge work into finished outputs, which feels like a bigger change than the model simply getting better at conversation. More and more, it feels like a tool that helps you make the thing you came for, instead of stopping at an answer about it.</p><p>So I&#8217;ll leave you with the question I keep asking my own team: what would you build first, if your research tool could actually run the work?</p><p>&#8212; Trond</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/notebooklms-execution-stack?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/notebooklms-execution-stack?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/notebooklms-execution-stack?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Google I/O 2026 Recap]]></title><description><![CDATA[Signaling a platform shift across the Google Ecosystem]]></description><link>https://trond.ai/p/google-io-2026-recap</link><guid isPermaLink="false">https://trond.ai/p/google-io-2026-recap</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Mon, 25 May 2026 18:13:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2QoS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.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_!2QoS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2QoS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp 424w, https://substackcdn.com/image/fetch/$s_!2QoS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp 848w, https://substackcdn.com/image/fetch/$s_!2QoS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp 1272w, https://substackcdn.com/image/fetch/$s_!2QoS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2QoS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp" width="1456" height="821" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:821,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30230,&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://trond.ai/i/199220610?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.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_!2QoS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp 424w, https://substackcdn.com/image/fetch/$s_!2QoS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp 848w, https://substackcdn.com/image/fetch/$s_!2QoS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.webp 1272w, https://substackcdn.com/image/fetch/$s_!2QoS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7025817d-c3e9-4b0f-8982-0e625527e33e_2096x1182.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Google I/O this year was about what comes after chatbots: agents everywhere, Gemini underneath everything, and a product stack built for a different way of working.</p><div><hr></div><p>I&#8217;ve been going to I/O since the first event in 2008. I was there when everyone fit on the plaza outside Charlie&#8217;s and when Sergey had sky divers deliver Google Glass to the stage at Moscone. The event has changed a lot, but the pattern this year felt familiar: lots of launches, but one clear story underneath them.</p><p>We didn&#8217;t really announce anything new for NotebookLM at I/O. Instead, we shared that people have created more than 1.5B notebooks, slide decks, podcasts, and other artifacts since launch. That is not the flashiest announcement, but it matters because it says the product has moved past &#8220;is this real?&#8221; and into &#8220;how much bigger can this get?&#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_!AC20!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AC20!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AC20!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AC20!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AC20!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AC20!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg" width="1456" height="828" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:828,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:156827,&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://trond.ai/i/199220610?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.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_!AC20!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AC20!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AC20!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AC20!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2c9e05e-3e8f-4b6c-90fc-b7d7b41f3787_2106x1198.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>NotebookLM has found a real audience by delivering something people understand and value. When I talk to people about how they use it, I&#8217;m always struck by the ingenuity they bring to it. The roadmap is still driven by user value, and that usually means quiet progress instead of big stage moments. Audio Overviews in 2024 was one memorable exception. Most of the time, the product just keeps getting better.</p><p>I tend to remember maybe two or three announcements from each I/O (<a href="https://blog.google/innovation-and-ai/technology/ai/google-io-2026-all-our-announcements/">out of 100</a>). This year, people were looking for Gemini, agents, and augmented reality. I think the show delivered on those dimensions, so I&#8217;ll focus on the parts that felt most important to me.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Gemini 3.5 Flash Led the Show</h2><p>Gemini 3.5 Flash was the centerpiece of I/O this year. AI coding is one of the places where LLMs have found real product-market fit, so the natural comparison is coding-specific benchmarks. That matters, but speed is the real story here. Flash delivers strong performance at a much faster pace than the alternatives.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IV0U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IV0U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IV0U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IV0U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IV0U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IV0U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg" width="977" height="749" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:749,&quot;width&quot;:977,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47949,&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://trond.ai/i/199220610?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.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_!IV0U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IV0U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IV0U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IV0U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2eb02f5-eca1-440a-852d-28ac0f89580f_977x749.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve been using it for awhile now, and it&#8217;s overtaken other models in my workflow. I knew it was good when I found myself annoyed not to have it on personal projects at home. With access to pretty much everything else on the market, I still missed Flash. Once you get used to that speed, it is hard to go back.</p><p>That Gemini 3.5 Flash is the model Google used to define I/O is telling. The pitch is not just that it is better. It is that it is fast enough to be useful across the places where Google wants AI to live: Search, Android Studio, AI Studio, and the broader developer stack via a refreshed Antigravity. Google is positioning this as the practical default for agentic work, not just the model you benchmark and admire.</p><p>Flash is also strong at tool calling, which is essential for agentic workflows. It&#8217;s the first model I&#8217;ve used that feels like it understands how and when to use the range of tools and skills I make available to it. That changes the experience a lot, because the model is not just answering well. It is taking action well. Runescape-Bench is one benchmark that tries to measure that, and Flash leads there too:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RCyc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RCyc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png 424w, https://substackcdn.com/image/fetch/$s_!RCyc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png 848w, https://substackcdn.com/image/fetch/$s_!RCyc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png 1272w, https://substackcdn.com/image/fetch/$s_!RCyc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RCyc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png" width="684" height="687" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:684,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:112905,&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://trond.ai/i/199220610?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.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_!RCyc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png 424w, https://substackcdn.com/image/fetch/$s_!RCyc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png 848w, https://substackcdn.com/image/fetch/$s_!RCyc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png 1272w, https://substackcdn.com/image/fetch/$s_!RCyc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2bedb0e-e68b-4dd9-abb1-fd3539bbff63_684x687.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The important thing here is the shape of the claim. Google is no longer arguing for intelligence in the abstract. It is arguing for a combination of speed, capability, and action. That is a more mature product story, and I think Google is right to bet that users will care more about that than model theater.</p><p>If I had to boil it down to one line, it would be this: Gemini 3.5 Flash is Google&#8217;s way of saying the next frontier is not smarter chat. It is faster things that work.</p><h2>Gemini Everywhere</h2><p>Once you see what the model announcement really means, the rest of the event snaps into focus.</p><p>Antigravity, the new agent-first developer environment, shows how Gemini 3.5 Flash changes AI coding tools. Gemini Spark is about more personal agent experiences. Managed Agents in the Gemini API point in the same direction. So do the Android Studio updates. So does the way Google keeps moving agentic features into Search and the Gemini app itself.</p><p>That is the pattern worth calling out: Google is not trying to win on one heroic app. It is trying to make every surface speak a common agentic language.</p><p>That means:</p><ul><li><p>Search becomes more agentic.</p></li><li><p>Developer tooling becomes more agentic.</p></li><li><p>The Gemini app becomes more proactive.</p></li><li><p>Android becomes a place where AI helps build, not just consume.</p></li></ul><p>That is why I/O felt less like a product launch and more like a platform reset. Google is centering on a single idea: if the next interface is conversational and task-driven, then Search, Android, Chrome, and the rest of the stack need to lean into that way of working.</p><h2>My takeaway</h2><p>Google I/O was not a year of isolated launches. It was a shift in how Gemini is becoming the platform for the company. NotebookLM showed that some of Google&#8217;s AI products already have real momentum with real users. Gemini 3.5 Flash was the core technical statement. Antigravity, Gemini Spark, Managed Agents, Search changes, and the Gemini app all pointed to the same expansion.</p><p>The line tying all of it together is simple: Google wants Gemini to become the default layer across its ecosystem. The question now is not whether Google can ship AI features. It clearly can. The real question is whether these systems become useful enough that people trust them with real work. Keynotes are not the story. The story is whether the thing saves time in ordinary moments.</p><p>If Google can make Gemini a trusted layer underneath your work, your search, and your devices, what do you actually want it to do better?</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/google-io-2026-recap?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/google-io-2026-recap?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/google-io-2026-recap?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Stella, Meet Merc]]></title><description><![CDATA[I bought a robot from a bar. My kids built it. The family AI got a body.]]></description><link>https://trond.ai/p/stella-meet-merc</link><guid isPermaLink="false">https://trond.ai/p/stella-meet-merc</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Wed, 06 May 2026 15:06:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Iz6r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Iz6r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Iz6r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Iz6r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Iz6r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Iz6r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Iz6r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg" width="5519" height="4077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4077,&quot;width&quot;:5519,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4221963,&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://trond.ai/i/196622934?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76e09070-0c17-4ff7-8dba-202eb4e2c90f_5712x4284.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_!Iz6r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Iz6r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Iz6r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Iz6r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce6de9e2-d72f-43dd-b22d-f76c5dc26786_5519x4077.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I was three sips into a whiskey at the Booking Office at St. Pancras when I clicked &#8220;buy.&#8221;</p><p>It had been a long day. I&#8217;d spent it at the Google DeepMind office in London, back-to-back meetings with researchers. One of them had assembled a <a href="https://www.pollen-robotics.com/">Reachy Mini</a> with his kids the prior weekend and was now poking at it as a way to interact with his AI work. He was <em>delighted</em>. I&#8217;d been talking about Stella all day. The pitch was basically: build one with your kids, see what an embodied agent actually feels like, find out if any of this matters when it has a face.</p><p>My favorite kind of decision: the kind you make in a bar.</p><div><hr></div><p><strong>My daughter lost her mind when I told her.</strong></p><p>Not the polite &#8220;oh cool, Dad&#8221; kids do when you&#8217;re trying. The actual <em>counting-down-the-weeks</em> version. I told her one Sunday morning over breakfast, and within about ninety seconds she had named it.</p><p>Merc.</p><p>She did this entirely on her own. Stella &#8212; our family AI, four months old now and running most of the calendar/email/lights/kitchen-display layer of our life &#8212; is named after the ship computer from <em><a href="https://www.youtube.com/watch?v=QydoaF-pfME">Miles from Tomorrowland</a></em>. Lucy watched that show a lot when she was little, and she remembered, without me saying a word, that there was a small robotic sidekick on the show called <a href="https://www.youtube.com/watch?v=XkRtfg9rHDc">M.E.R.C</a>.</p><p>She just put it together. &#8220;If Stella is the ship, Merc is the helper.&#8221; I nodded like I&#8217;d been planning that the whole time. (I had absolutely not been planning that the whole time.)</p><p>It was Merc the moment she said it. She counted the weeks until the box arrived.</p><div><hr></div><p><strong>The kit landed this past week.</strong></p><p>For the uninitiated: the Reachy Mini is an open-source desktop robot from Pollen Robotics (now part of Hugging Face). It&#8217;s small. It has a head that moves, two antennas that swivel, and a face that, well, looks at you. It does not do laundry. It does not walk. It sits on a desk and emotes and listens and looks at you, and that&#8217;s the whole pitch and basically the whole point.</p><p>It also arrives in a hundred small pieces in a plain cardboard box. The kind of unboxing that&#8217;s simple and practical. I like simple.</p><p>We did the build over Friday night and Saturday afternoon, May 1st and 2nd. Both kids were in. Leo and Lucy took turns: one would line up the part, the other would seat the screw, then they&#8217;d swap. I sat with the manual open and tried to be useful.</p><p>&#8220;Useful&#8221; is generous. My job was closer to sous chef than anything else: hand them the right piece, double-check orientation, point at a thing on the page. The kids did the actual building. This is how it should be. Pretty much the <em>whole</em> point of being a dad.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!flvv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!flvv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!flvv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!flvv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!flvv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!flvv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2628832,&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://trond.ai/i/196622934?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.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_!flvv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!flvv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!flvv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!flvv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cddcbf-9560-4d34-aae7-5123008cef38_4032x3024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A few parts went on backward and had to come back off. Nothing dramatic. The kit is forgiving: the manual is good, the parts are well-labeled, and Pollen has clearly thought about the fact that small, distractible humans are going to be the ones putting it together. It went smoothly. It was the right amount of fiddly to feel like an accomplishment without becoming a chore.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tlXP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tlXP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tlXP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tlXP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tlXP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tlXP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136867,&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://trond.ai/i/196622934?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.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_!tlXP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tlXP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tlXP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tlXP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d43f8c2-17a5-4c07-9398-d4f1bfaec0b3_2000x1500.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>A few specs, for the curious.</strong> Eleven inches tall, a kilo and a half on the desk. A 6-DOF head &#8212; pan, tilt, roll &#8212; on a body that can rotate a full 360&#176;. Two animated antennas. A wide-angle HD camera in the face, a 4-mic array around the base, a 5W speaker. We got the <strong>Wireless</strong> SKU, which means a Raspberry Pi CM4 onboard, a battery, and an IMU. No tether, no laptop next to it. Fully autonomous. $299 to start, Python-programmable, and Pollen says the build is a 2&#8211;3 hour job. Ours took Friday night plus a chunk of Saturday afternoon. We were in no hurry, and there were two kids negotiating turns with the screwdriver.</p><div><hr></div><p><strong>The first time we powered it on, Merc moved its head.</strong></p><p>That was it. But it was <em>exciting</em>.</p><p>Two kids leaning over a kitchen table watching a small robot turn its head and twitch its antennas. Leo immediately wanted to know if Merc could see him. Lucy wanted to know if Merc could hear her. We connected a game controller and they took turns (well, argued about taking turns mostly) controlling the various movable parts.</p><p>You can talk yourself into being unimpressed by a head and two antennas. <em>Don&#8217;t.</em> Watch a kid watch a robot look at them. Tell me what that feels like.</p><div><hr></div><h2>So why a robot?</h2><p>I&#8217;ve written a lot about Stella. She&#8217;s been online about four months. She runs the calendar, watches the email, runs the kitchen display, controls the lights, calls the car dealership. She&#8217;s useful &#8212; and I want to be honest about this &#8212; <em>she&#8217;s also a little transactional</em>. And temperamental as new technology tends to be.</p><p>You ask Stella a thing. Stella does the thing. Stella reports back. Most of the interaction lives in chat windows: Telegram threads, the kitchen display, the occasional voice exchange. It works. But it&#8217;s mostly typing into a box. And sometimes talking into a box that doesn&#8217;t respond correctly.</p><p>This is the trap I keep noticing with personal AI. The capability is <em>enormous</em> and the discovery is <em>terrible</em>. There&#8217;s so much these systems can do, and so few natural ways for a family to find out what those things are. The interface is a text box. The only question that gets answered is the one you knew to ask.</p><p>Embodiment is an experiment I wanted to try. Not because a robot can do <em>more</em> than chat (Merc is dramatically less capable than Stella) but because a robot is <em>there</em>. It sits on a desk. It looks up when you walk in. It&#8217;s a thing you notice, not an app you have to remember to open. When the kids walk past it, they&#8217;ll ask it questions they&#8217;d never have thought to type into a chat window.</p><p>That&#8217;s the thesis at least. A friendly, cute robot with a personality, sitting in the room with you, makes the family AI feel <em>familiar</em> instead of <em>transactional</em>. Less Slack channel, more pet that knows things.</p><p>We&#8217;ll see if I&#8217;m right. That&#8217;s why we&#8217;re testing it. I haven&#8217;t actually gotten that part working yet.</p><div><hr></div><h2>What&#8217;s next</h2><p>The point of Merc isn&#8217;t really Merc. It&#8217;s Merc <em>plus</em> Stella. The kids and I have been brainstorming, and the list is long. A few things near the top:</p><ul><li><p><strong>Merc as a voice surface for Stella.</strong> Stella already has a voice (it runs locally on the Mac Mini&#8217;s Neural Engine), but right now she&#8217;s tied to the kitchen display and a wake word. The kids want to be able to walk up to Merc and talk to Stella, and have Merc <em>do something expressive</em> while Stella thinks. Antennas up while listening. A little head-tilt when she has a question. Antennas leaning forward when she&#8217;s working on it.</p></li><li><p><strong>Merc as a hands-free way to ask Stella for things.</strong> Not literally hands. Merc has no arms. But Merc can <em>ask Stella</em> to do things on the kids&#8217; behalf. &#8220;Merc, remind me to water my plant&#8221; &#8594; Merc &#8594; Stella &#8594; calendar entry. The bridge for this is already running in test (auditable JSON in <code>~/Stellasphere/agents/shared/merc-to-stella/inbox/</code>, because of course it is) but the kids haven&#8217;t gotten to play with it yet.</p></li><li><p><strong>Games.</strong> Lucy wants to play 20 questions with Merc. Leo wants Merc to play redlight greenlight. I have no idea how either of those will go and I cannot wait to find out.</p></li><li><p><strong>An expressive vocabulary.</strong> We&#8217;ve defined a small set of moods Merc can be in: <em>quiet, wake, sleep, thinking, happy, curious, alert, reminder, stop</em>. Each gets its own antenna and head behavior. The goal is for Merc&#8217;s body language to be readable from across the room without anyone needing to look at a screen.</p></li></ul><p>It&#8217;s early. The whole thing is only a few days old. The kids haven&#8217;t really lived with Merc yet. We&#8217;re going to find out what works by <em>playing</em> with it for a few weeks and seeing what they actually reach for. It&#8217;s called building to learn, and it&#8217;s what we do here.</p><div><hr></div><p><strong>One more thing on the build-with-your-kids piece of this.</strong></p><p>I keep coming back to this in everything I do with AI. You can read about agents. You can take a course. You can watch a demo. None of it lands the way building one with your hands does. And building one with your kids is a level beyond <em>that</em>, because they&#8217;re going to ask questions that don&#8217;t have textbook answers, they&#8217;re going to discover behaviors you didn&#8217;t anticipate, and they&#8217;re going to find the bugs faster than you will.</p><p>Lucy did the product positioning for me on the ottoman in the family room before we&#8217;d seated a single screw. &#8220;Stella&#8217;s the ship. Merc&#8217;s the helper.&#8221; That&#8217;s the whole thing. I&#8217;ve been trying to articulate that thesis in long-form posts for months and my 12-year-old beat me to it in eight words.</p><p>If you&#8217;ve been waiting for the right entry point into the embodied side of all this, Reachy Mini is a <em>very</em> friendly first robot. The community is great. The build is approachable. The price won&#8217;t ruin you. And there is something satisfying about a kit that arrives in a box and ends with a small, curious robot watching your kid from across the kitchen.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IIpF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IIpF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IIpF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IIpF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IIpF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IIpF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg" width="1400" height="933" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:933,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:334038,&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://trond.ai/i/196622934?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.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_!IIpF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IIpF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IIpF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IIpF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87a5afc-4ecf-4185-96f5-85bcbc5ec9bc_1400x933.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>10/10 would buy a robot from a bar again.</p><div><hr></div><p><em>If you&#8217;re building anything embodied with your family, Reachy or otherwise, I want to hear about it. What&#8217;s working? What surprised you? Reply, or find me on X. I read everything.</em></p><p><em>Merc, if Stella ever forwards this to you during a heartbeat: hi, buddy. Welcome to the Stellosphere. Play nice with the ship. Wuellners, Let&#8217;s Rocket!</em></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[2026 is the year of Just-in-Time UX]]></title><description><![CDATA[I wildly underestimated how fast we'd get here.]]></description><link>https://trond.ai/p/2026-is-the-year-of-just-in-time</link><guid isPermaLink="false">https://trond.ai/p/2026-is-the-year-of-just-in-time</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Fri, 01 May 2026 14:25:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!EIak!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EIak!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EIak!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg 424w, https://substackcdn.com/image/fetch/$s_!EIak!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg 848w, https://substackcdn.com/image/fetch/$s_!EIak!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!EIak!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EIak!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg" width="1456" height="618" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:618,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:743719,&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://trond.ai/i/196085559?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.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_!EIak!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg 424w, https://substackcdn.com/image/fetch/$s_!EIak!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg 848w, https://substackcdn.com/image/fetch/$s_!EIak!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!EIak!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d307aab-d392-48a0-8c3b-bd0b342f7b48_1584x672.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Earlier this year I wrote that 2026 would be the year AI learned to compose UIs in real-time. Users watching interfaces assemble live. Interactive components with full state. Agents drawing UI on the fly specifically to solve your precise need.</p><p>Looks like I nailed the prediction, but underestimated the speed and the weirdness.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>By May 2026&#8212;literally right now&#8212;an entire ecosystem is crystallizing around this notion. A2UI. Shadify. AG-UI. And a bunch of others I&#8217;m still discovering. All shipping real-time, generative UIs. Software is about to get rad!</p><div><hr></div><h2><strong>My Original Prediction</strong></h2><p>Here&#8217;s what I actually wrote back in January (from &#8220;<a href="https://trond.ai/p/ai-predictions-for-2026">12 AI Predictions for 2026</a>&#8221;):</p><blockquote><p>Chat has been the predominant interface for AI. There are interesting examples of linking useful UI components into a chat interface. In November 2025, Anthropic and OpenAI partnered to release the MCP Apps Extension&#8212;a specification that brings standardized interactive UI capabilities to the Model Context Protocol.</p><p>This will lead to a new class of apps that self-compose UIs in real-time. They&#8217;ll draw components for existing patterns from vast libraries of capabilities, but when a novel need arises, they&#8217;ll create bespoke experiences to match real-time user requests. The very definition of software will forever change, and 2026 is when we see the beginnings of this evolution.</p></blockquote><p>So I was thinking: MCP standardizes things &#8594; builders adopt &#8594; apps ship interactive UX. A nice sequential story. But that&#8217;s not quite how it went.</p><p>A lot started unifying when Google shipped A2UI. It happened before there was consensus we needed it. Builders started using it without waiting for the ecosystem to debate. The entire thing organized backward&#8212;not &#8220;let&#8217;s standardize first, then build,&#8221; but &#8220;let&#8217;s build, and the standard will emerge from what works.&#8221; I kind of think that trend is here to stay.</p><p>Vibe coding might play a role, but that&#8217;s not all of it. We&#8217;re all moving too fast for official standards to keep up. Standards organizations are going to need to stay on their toes. Or maybe it&#8217;s already too late. Yeah, they&#8217;re probably more historians than futurists now.</p><div><hr></div><h2><strong>Real-Time UX is Shipping Now</strong></h2><p>Before A2UI, this space was a mess. Everyone building generative UI was inventing their own protocol. Custom WebSockets. Ad-hoc JSON schemas. No way for an agent trained on one platform to work on another.</p><p>A2UI is solving that. It&#8217;s boring on purpose&#8212;just a declarative way for agents to describe UIs. Not code. Not instructions. Just &#8220;here&#8217;s what this UI looks like.&#8221; JSON you can stream, component by component, platform by platform. This is key because now:</p><ul><li><p><strong>Web Components</strong>, <strong>Angular</strong>, <strong>React</strong>, <strong>Flutter</strong>, <strong>SwiftUI</strong>, <strong>Jetpack Compose</strong> can all understand the same language</p></li><li><p>One agent can work everywhere</p></li><li><p>It requires no translation and no glue code.</p></li></ul><p>It&#8217;s all pulled together via <strong>progressive rendering</strong>. As the agent thinks and generates components, the client renders them live. You&#8217;re not stuck watching a spinner. You&#8217;re watching the UI assemble. Components appearing. Lists populating. Forms showing up. All while the agent is still thinking.</p><p>That&#8217;s becoming the default UI paradigm. 2026 isn&#8217;t just the year where UI is generated in real time. <strong>2026 is the year of generative UI</strong>.</p><p>Let&#8217;s talk about a few of the big things driving this space:</p><h3><strong>Google A2UI: The Shared Protocol</strong></h3><p>Google shipped <strong><a href="https://a2ui.org/">A2UI</a></strong>. Agent-to-User Interface. It&#8217;s deceptively simple.</p><p>Instead of agents generating code&#8212;React components, HTML, Flutter widgets&#8212;they generate a flat JSON description of what the UI should look like. That&#8217;s it. One agent, any platform.</p><p>Version 0.9 shipped in April 2026. Multiple renderers are already shipping stable versions. This should have taken 18 months to standardize. It took 6.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L9mw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L9mw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg 424w, https://substackcdn.com/image/fetch/$s_!L9mw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg 848w, https://substackcdn.com/image/fetch/$s_!L9mw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg 1272w, https://substackcdn.com/image/fetch/$s_!L9mw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L9mw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg" width="352" height="373" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:373,&quot;width&quot;:352,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A2UI protocol supporting multiple renderers&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="A2UI protocol supporting multiple renderers" title="A2UI protocol supporting multiple renderers" srcset="https://substackcdn.com/image/fetch/$s_!L9mw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg 424w, https://substackcdn.com/image/fetch/$s_!L9mw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg 848w, https://substackcdn.com/image/fetch/$s_!L9mw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg 1272w, https://substackcdn.com/image/fetch/$s_!L9mw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4cc4e8f-a640-4533-bb90-040009f008ec_352x373.svg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3><strong>Shadify: Real time UI component system</strong></h3><p>Describe a UI in plain English. Get a live, interactive <a href="https://ui.shadcn.com/">shadcn/ui</a> page back. Export it as clean React code. This makes it really easy to deliver a consistent UI because the agent isn&#8217;t inventing new components, it&#8217;s remixing what already exists. But the remix is custom and it&#8217;s specific to your request. And it all happens in realtime -- which is amazing. And it&#8217;s <a href="https://github.com/CopilotKit/shadify">open source</a> under an MIT license which I like.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;b146dd9c-015b-4b9f-8e1b-8713a9e7e260&quot;,&quot;duration&quot;:null}"></div><div><hr></div><h3><strong>CopilotKit: Making Generative UI the Default</strong></h3><p><a href="https://www.copilotkit.ai/">CopilotKit</a> has been on the Generative UI train for awhile and is building some of the most interesting capabilities with it. They can help an Agent generate a stargazing app with live sky compass, 3D solar system, interactive dashboards with charts. All in real-time, in response to requests. It&#8217;s pretty amazing.</p><p>This isn&#8217;t a one-off demo. It&#8217;s a framework thousands of developers are using to compose UIs on the fly. This space is moving so fast, we already have framework companies gaining traction:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;446b62fa-dd7b-4ead-ab92-4c1f08e71938&quot;,&quot;duration&quot;:null}"></div><div><hr></div><h3><strong>AG-UI Protocol: Streaming Agent Events in Real-Time</strong></h3><p><a href="https://docs.ag-ui.com/introduction">AG-UI </a>is an <strong>open</strong>, <strong>lightweight</strong>, <strong>event-based</strong> protocol that standardizes how AI agents connect to user-facing applications. It standardizes how agent state, UI intents, and user interactions flow between your model/agent runtime and user-facing frontend applications.</p><p>This allows agent interactions to feel more real-time because instead of waiting for a complete response, you get play-by-play updates:</p><p>&#8220;Agent is analyzing...&#8221; &#8594; tokens start flowing &#8594; &#8220;Generating content...&#8221; &#8594; UI updates as events arrive.</p><p>Combined with A2UI, this creates a full stack: agents think out loud, UIs render incrementally, users experience live feedback instead of spinners. It&#8217;s a key part of how realtime generative UI is beginning to win.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;adc3e6d9-a456-40c6-b127-f381792f61ed&quot;,&quot;duration&quot;:null}"></div><div><hr></div><h2><strong>Why This Happened in 6 Months (Not 12)</strong></h2><p><strong>A2UI standardized what was scattered.</strong> Before: WebSockets, custom protocols, one-off implementations. After: One open protocol, multiple renderers ready, agents speaking the same language.</p><ul><li><p><strong>The ecosystem coalesced simultaneously.</strong> MCP + A2UI + AG-UI = A complete stack. Not pieces in sequence&#8212;a system shipping all at once.</p></li><li><p><strong>Incentives aligned perfectly.</strong> Developers hated code &#8594; compile &#8594; deploy. Streaming eliminates it. Agents eliminate manual state changes.</p></li><li><p><strong>Economics improved.</strong> Streaming is cheaper than batch. Partial results matter before the full response arrives. Agents calling tools directly mean fewer context switches and lower costs.</p></li></ul><p>I predicted: Self-composing UIs. Bespoke experiences. Real-time composition. All of that landed and more. Today, you&#8217;re not asking the AI to write code. You&#8217;re delegating state changes to an agent that speaks your app&#8217;s language. The UI is just the visualization layer.</p><div><hr></div><h2><strong>What&#8217;s Coming</strong></h2><p>The shift from &#8220;chat interface&#8221; to &#8220;standardized protocols for agent-composed, real-time, voice-driven state manipulation&#8221; happened in 6 months instead of 12. And it&#8217;s going to accelerate from here. I see more on the horizon:</p><ol><li><p><strong>On-device A2UI.</strong> All of this currently assumes live agents in the cloud. Imagine agents running locally, rendering UIs via A2UI to your device. Lower latency. Privacy. No API dependency.</p></li><li><p><strong>Persistent agent memory in UX.</strong> Right now UIs are stateless across sessions. What happens when your agent remembers your interaction patterns, preferences, and context, and adapts the interface itself? The UI becomes genuinely personal.</p></li><li><p><strong>Multi-agent, shared-state collaboration.</strong> Multiple agents, multiple users, one shared canvas. Teams collaborating through agent-composed interfaces. No more meetings about how to format the data&#8212;the agent generates the interface.</p></li><li><p><strong>Accessibility baked in by default.</strong> Voice + state is already 10x more accessible than clicking. The next step: Agents that automatically generate semantic HTML, alt text, keyboard navigation, and ARIA as they compose. Accessibility isn&#8217;t an afterthought&#8212;it&#8217;s in the protocol.</p></li><li><p><strong>Agents in your existing tools.</strong> A2UI renderers shipping inside enterprise software. Slack. Figma. Notion. Your existing tools suddenly have agent-driven, real-time UI generation built in. The line between &#8220;app&#8221; and &#8220;agent&#8221; disappears.</p></li></ol><p>The definition of software hasn&#8217;t changed yet. But the friction is gone. By end of 2026, &#8220;real-time generative UI with A2UI&#8221; will be as normal as &#8220;responsive design&#8221; was 10 years ago. The developers who ship voice-driven agents that manipulate state directly win. The platforms that make this the default layer&#8212;not an add-on&#8212;own the next era.</p><p>If you&#8217;re building tools, this isn&#8217;t &#8220;the moment.&#8221; This is <em>accelerating</em>. The infrastructure exists. The pattern is proven. The ecosystem is moving. The question is simple: Are you shipping voice-driven agents that manipulate state in real-time, or are you still asking users to click?</p><p>Because by the time you finish reading this, someone shipped something new that&#8217;s doing exactly that.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/2026-is-the-year-of-just-in-time?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/2026-is-the-year-of-just-in-time?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/2026-is-the-year-of-just-in-time?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div><hr></div><p>Prefer an audio overview?  I got you:</p><div class="native-audio-embed" data-component-name="AudioPlaceholder" data-attrs="{&quot;label&quot;:null,&quot;mediaUploadId&quot;:&quot;1be8be62-9941-4f70-8343-ea36e7caaa79&quot;,&quot;duration&quot;:1178.8016,&quot;downloadable&quot;:false,&quot;isEditorNode&quot;:true}"></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[My Next Chapter - NotebookLM]]></title><description><![CDATA[Building for Trust, Scaling for Wonder]]></description><link>https://trond.ai/p/my-next-chapter-notebooklm</link><guid isPermaLink="false">https://trond.ai/p/my-next-chapter-notebooklm</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Mon, 20 Apr 2026 15:15:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!oXHH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few weeks ago, <a href="https://x.com/tokumin">Simon Tokumine</a> and <a href="https://x.com/joshwoodward">Josh Woodward</a> presented me with an opportunity I couldn&#8217;t ignore: the chance to lead NotebookLM.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oXHH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oXHH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png 424w, https://substackcdn.com/image/fetch/$s_!oXHH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png 848w, https://substackcdn.com/image/fetch/$s_!oXHH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!oXHH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oXHH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png" width="2688" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:2688,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7814421,&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://trond.ai/i/194762710?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700ed397-2d75-496e-929f-98cff73ba806_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oXHH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png 424w, https://substackcdn.com/image/fetch/$s_!oXHH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png 848w, https://substackcdn.com/image/fetch/$s_!oXHH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!oXHH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7ee1c86-c07e-4fe5-a4df-7da757cde4be_2688x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ll admit, I was deeply conflicted. I have loved everything about my time in the GenMedia group, and the teams we&#8217;ve built in Labs are truly special. <a href="https://labs.google/projectgenie">Project Genie</a> is delivering breakthroughs on an entirely new universe of interactive experiences. <a href="https://www.flowmusic.app/">Flow Music</a> (formerly producer.ai) is already pushing the boundaries of what&#8217;s possible with sound, and Doppl is bringing our virtual try-on technology to life in shopping. Leaving that work, and the people who made it possible, is not an easy choice.</p><p>But after consulting my council of advisors and digging into the roadmap, I ultimately decided that the challenge ahead at NotebookLM is one I&#8217;m eager to take on. I&#8217;m accepting this with a healthy dose of &#8220;uncomfortable excitement.&#8221;</p><p>I&#8217;m also fully aware that I am stepping into the footsteps of people I deeply admire. <a href="https://x.com/raizamrtn">Raiza</a>, Josh, and Simon have built an incredible foundation of user love, rooted in trust and genuine utility. My goal is to build upon that culture with the same care they&#8217;ve shown.</p><p>To the teams I&#8217;m leaving behind, <a href="https://x.com/eliasroman">Elias</a>, <a href="https://x.com/ebreece">Elliott</a>, <a href="https://x.com/sakshirambhia">Sakshi</a>, <a href="https://x.com/pk_notes">Pavan</a>, <a href="https://x.com/NicoleSega40714">Nicole</a>, <a href="https://x.com/sethforsgren">Seth</a>, and <a href="https://x.com/drivascos">Diego</a> you are an absolutely unmatched group of product leaders. While I&#8217;m literally just moving across the hall, I will sincerely miss working with you as closely as I have.</p><div><hr></div><h2>The Opportunity</h2><p>NotebookLM is a crown jewel at Google, and I take the responsibility of stewarding it seriously. It is a profound honor to guide this product into the agentic era.</p><p>NotebookLM isn&#8217;t just a novelty, it is a genuine partner for research, learning, and project organization. Its fundamental promise is its grounding. It is built entirely from the sources <em>you</em> provide, with clear citations that let you verify every output yourself. In a world where healthy skepticism of AI is necessary, that transparency is our strongest asset.</p><p>As I settle into this role, I&#8217;m focused on one central question: <strong>How do we scale NotebookLM without losing touch with what makes the product special?</strong></p><p>We recently began rolling out our integration into Gemini, which will introduce NotebookLM to millions of new users. The risk is that the product identity becomes diluted as we reach a broader, more diverse audience. We&#8217;ve delighted our early power users by focusing on the &#8220;learning journey,&#8221; turning dense information into synthesized &#8220;magic.&#8221; As we grow, my priority is ensuring that our commitment to grounding and trust remains the North Star. We will use these new surfaces as a doorway, while keeping the &#8220;core notebook&#8221; experience a place where the real work happens.</p><h2>What Comes Next</h2><p>Technically, I joined the team last week. You may have noticed I missed my usual weekly post, a first since I started publishing here. I made the decision to prioritize getting up to speed and truly understanding the team&#8217;s needs before I picked up the pen again. It&#8217;s been an incredible first week.</p><p>I&#8217;m thrilled to be partnering with this team to grow both our product and our culture. We are on a mission to build tools that help people learn and work more naturally, not by replacing them with AI, but by partnering with them to become the best versions of themselves.</p><p>I&#8217;m also committed to staying engaged with the people who use this product. You can find me here on <a href="https://trond.ai/">Substack</a>, on <a href="https://x.com/trondw">X</a>, and on <a href="https://www.reddit.com/user/MegatrondW/">Reddit</a>. I want to build in the open, stay close to your feedback, and showcase our team&#8217;s commitment to building this <em>with</em> you.</p><p>We have a lot of work to do, and I couldn&#8217;t be more excited to get started.</p><p>&#8212; Trond</p>]]></content:encoded></item><item><title><![CDATA[The Great On-Device Migration]]></title><description><![CDATA[Gemma4 grabs the baton from Claude]]></description><link>https://trond.ai/p/the-great-on-device-migration</link><guid isPermaLink="false">https://trond.ai/p/the-great-on-device-migration</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Mon, 06 Apr 2026 07:31:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1d_3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1d_3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1d_3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!1d_3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!1d_3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!1d_3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1d_3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7984033,&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://trond.ai/i/193279251?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1d_3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!1d_3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!1d_3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!1d_3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9adfa8-0655-469c-ac02-a4e3be9669ac_2752x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Last week Google dropped <a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/">Gemma-4</a> and it is a ridiculously awesome piece of AI engineering.</p><div><hr></div><h2>Gemma4</h2><p>Everyone is obsessing over the flagship 31B model pushing the limits for open limits on the Arena AI leaderboard. This is insane for an open model, and pretty incredible for it to be available via a permissive <a href="https://goo.gle/gemma-4-apache-2">Apache 2.0 License</a>. But if you want to run Gemma at home, the real prize is the 26B Mixture-of-Experts (MoE) variant. You lose minimal ELO impact, but can easily run it on readily available hardware.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b029!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b029!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png 424w, https://substackcdn.com/image/fetch/$s_!b029!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png 848w, https://substackcdn.com/image/fetch/$s_!b029!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png 1272w, https://substackcdn.com/image/fetch/$s_!b029!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b029!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Open model performance vs size on Arena.ai&#8217;s chat arena&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Open model performance vs size on Arena.ai&#8217;s chat arena" title="Open model performance vs size on Arena.ai&#8217;s chat arena" srcset="https://substackcdn.com/image/fetch/$s_!b029!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png 424w, https://substackcdn.com/image/fetch/$s_!b029!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png 848w, https://substackcdn.com/image/fetch/$s_!b029!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.png 1272w, https://substackcdn.com/image/fetch/$s_!b029!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13d47c89-3b37-466d-af48-914cd64d3737_2068x1164.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It packs 26 billion total parameters but only activates 3.8 billion per token. You get a massive 256K context window, and it to rank #6 overall among all open models. More importantly, it runs blazingly fast on a Mac Studio. Which I happen to have because my photography habit <em>&#8220;required&#8221;</em> I upgrade my old device last fall. </p><p>I&#8217;ve been itching to rip the cloud brain out of my OpenClaw system and wire up Gemma-4 locally since <a href="https://www.linkedin.com/in/triswarkentin">Tris</a> told me about it a few weeks ago. But when a system is working just fine, it&#8217;s hard to justify breaking it just to see what happens.</p><p>Then Anthropic did me a massive favor: they killed API access for tools like OpenClaw on my current plan. I had been using a mix of Gemini and Claude in my system, but I was looking for an excuse to change so&#8230; twist my arm. I took the opportunity to pull the plug on Claude and move entirely to local silicon.</p><div><hr></div><h2>The Swap</h2><p>You can&#8217;t just change a URL to swap an agent&#8217;s brain. But thanks to <a href="https://ollama.com/">Ollama</a>, it was pretty close. I&#8217;m on vacation this week with my family in London, so I needed to be able to do brain surgery from my phone. </p><p>So there I was, sitting on the Tube, dragging two tired kids back to our Notting Hill Airbnb, when I read the update on X from <a href="https://x.com/bcherny">Boris Cherny</a> about the Claude change. I fired up Telegram right then and got the process going. Kick off a command at a station, let Stella cook between stops while I was without service. Actually works pretty well!</p><p>We were returning from the British Museum after checking out the Parthenon marbles depicting the birth of Athena. <em>(They really should be in Greece where they belong!)</em> In the myth, Athena springs fully formed from the head of Zeus. I mention this because I named my Mac Studio Athena when we set her up last year. It feels poetic to have my own Athena, the Mac Studio node sitting 5,000 miles away in California, getting a new brain birthed directly from Gemini.</p><p>I started by having Stella remotely log into Athena to kick off an upgrade of Ollama to a version that supports the new Gemma-4 manifest format. Then it downloaded the <a href="https://ollama.com/library/gemma4:26b">ollama/gemma4:26b</a> model. Took about 10 seconds at the Embankment stop on the Tube to get this started. </p><p>Next came the OpenClaw gateway patch for Stella on my Mac mini. I pointed the provider to <code>http://athena.local:11434/v1</code> and set the default model to <code>ollama/gemma4</code>. A quick request at the Sloane Square stop. </p><p>I applied the config and restarted the system. Then I ran <code>openclaw doctor</code> from my phone via Chrome Remote Desktop. This was actually the hardest bit because it&#8217;s a bit of a pain to drive a terminal via CRD on a phone. The text is just so small! Got that done before we pulled into Notting Hill Gate.</p><p>After the process ran, everything just worked. Before we got back to the AirBnB.</p><div><hr></div><h2>Running on my own silicon</h2><p>Now Stella is back online, processing prompts and executing workflows, completely untethered from the cloud.</p><p>The API bill is gone. The latency is near zero. And because it runs entirely on Athena, the data never leaves my house.</p><p>In fact, I started writing this article from my phone while my son Leo and I rode the train out to Richmond for a Ted Lasso tour. I&#8217;m finalizing it right now over a pint at The Prince&#8217;s Head (the pub from the show). While we ate, Stella formatted the draft and mapped out our train route to our next stop&#8212;a street photography tour near The Shard. It did all of this on local silicon 5,000 miles away, streaming the results right to my pocket with no delay.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/the-great-on-device-migration?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/the-great-on-device-migration?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/the-great-on-device-migration?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p>Builder&#8217;s note: Some migrations take weeks. Some I completely whiff on. This one just worked. Watching your own AI agent run entirely on your own hardware is pretty awesome. You should try it.</p>]]></content:encoded></item><item><title><![CDATA[What my daughter taught me about NotebookLM]]></title><description><![CDATA[NotebookLM isn&#8217;t about finding your learning style. It&#8217;s more interesting than that.]]></description><link>https://trond.ai/p/what-my-daughter-taught-me-about</link><guid isPermaLink="false">https://trond.ai/p/what-my-daughter-taught-me-about</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Mon, 30 Mar 2026 14:32:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6Lma!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6Lma!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Lma!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!6Lma!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!6Lma!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!6Lma!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Lma!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6439569,&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://trond.ai/i/192381118?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6Lma!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!6Lma!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!6Lma!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!6Lma!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb407b7b-b6e1-41a9-b09c-630f3470150f_2752x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Over winter break, my 12-year-old called me over to look at her laptop.</p><p>She was studying for a quiz on a book she&#8217;d been reading. She had flashcards. And a podcast about the book &#8212; two AI hosts walking through the themes, the characters, the things that would probably show up on the test. She&#8217;d made both herself using NotebookLM. I didn&#8217;t even realize she knew about the product. Which is funny, because I helped build the Audio Overviews feature she was showing me.</p><p>It turns out NotebookLM is very popular at her school both among students and teachers. She had been using it all semester to build herself a study system. On her own. Which is pretty cool.</p><p>That&#8217;s the moment I understood how impactful NotebookLM can be.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>When we were developing Audio Overviews at Google Labs, we knew it was a novel way to help people engage with their content. The immediate reaction when we shipped was delightful &#8212; people were surprised that such lifelike audio was possible. But the real impact turned out to be something we felt more than predicted: it reached people who felt they learned best by listening. People who&#8217;d been handed PDFs and book chapters their whole lives, formats they struggled to connect with.</p><p>That realization pushed the team further. Mind maps for content that benefits from clearly outlined structure. Slide decks for information that combines visual and written information. Videos for content that benefits from a deeper telling of the story or motion to bring ideas to life. Flashcards to help people test themselves and secure knowledge.</p><p><strong>Builder&#8217;s note:</strong> This isn&#8217;t a feature roadmap built around &#8220;what&#8217;s technically cool.&#8221; Each output format is a bet that the same information, delivered differently, becomes useful to a different person or within another context. Google&#8217;s mission is to organize the world&#8217;s information and make it accessible and useful. NotebookLM is what &#8220;useful&#8221; looks like when you take it seriously.</p><div><hr></div><h2><strong>What NotebookLM actually is</strong></h2><p>Most people I talk to think of it as a chatbot for their files. Upload a PDF, ask it questions. That&#8217;s not wrong, but it&#8217;s missing most of what makes it interesting.</p><p>NotebookLM is a research and learning environment grounded entirely in sources you choose. You bring the material; the system stays inside it. Every answer comes with citations back to your specific sources, which massively reduces hallucinations. That constraint is the whole point.</p><p>The interface has three panels. Sources on the left: everything you&#8217;ve uploaded or linked. Chat in the middle: ask questions, get answers, save the good ones as notes. Studio on the right: where you generate outputs to make your information more useful.</p><p>You can put in: PDFs, Google Docs, websites, YouTube URLs, audio files, raw text, even your own notes. I find it helpful to share voice recordings of my own disorganized thoughts about the topic. The system does the organization automatically, which feels like magic.</p><p>What you get out: Audio Overviews, Video Overviews (in three formats, including a Cinematic mode that is genuinely stunning), Mind Maps, Infographics, Slide Decks, Flashcards, Quizzes, Briefing Documents, Study Guides, FAQs. All grounded in your sources, all completely different ways into the same material.</p><div><hr></div><h2><strong>The learning styles myth</strong></h2><p>Before I get into how to use NotebookLM, I want to flag something.</p><p>The obvious framing for a tool like NotebookLM is: figure out your learning style, pick the matching output format. Visual learner? Mind map. Audio learner? Podcast. You get the idea.</p><p>That framing is wrong. Not intuitively wrong &#8212; it feels right, which is why over 70% of educators still believe it. Scientifically wrong. The research on &#8220;learning styles&#8221; as fixed, matchable preferences has been thoroughly debunked. A 2024 meta-analysis across more than 1,700 students found that matching teaching style to learning style had no meaningful impact on performance. The effect size is 0.04. Essentially zero.</p><p>What the research does support is something more interesting: combining formats builds better understanding than any single format alone. This is called Dual Coding Theory. When you pair verbal information with visual information, the two memory systems reinforce each other. You retain more. You understand deeper.</p><p>My daughter didn&#8217;t pick her learning style. She made flashcards <em>and</em> a podcast. Both. That&#8217;s Dual Coding in action, figured out by a 12-year-old without anyone explaining the theory to her.</p><p>So the tips below aren&#8217;t about finding your type. They&#8217;re about using the tool the way the science suggests learning actually works.</p><div><hr></div><h2><strong>Six tips for getting started</strong></h2><p><strong>1. Start with something you actually need to understand</strong></p><p>Don&#8217;t test NotebookLM with a random PDF just to see what happens. Pick something you&#8217;re genuinely trying to learn &#8212; a topic at work, a book you&#8217;re reading, a subject your kid is studying for a test. The tool works best when you have a real question. Generic inputs produce generic outputs. Here are a few topics already set up as notebooks if you want a running start:</p><ul><li><p><a href="https://notebooklm.google.com/notebook/f7607d7a-584c-4f35-96fc-f6815c573a6c">Introduction to NotebookLM</a></p></li><li><p><a href="https://notebooklm.google.com/notebook/505ee4b1-ad05-4673-a06b-1ec106c2b940">Parenting Advice for the Digital Age</a></p></li><li><p><a href="https://notebooklm.google.com/notebook/40b0bb3f-afa6-49b2-959f-d91fb0a91a3b">Jane Austen: The Complete Works</a></p></li><li><p><a href="https://notebooklm.google.com/notebook/780a38ee-d0a6-4fb1-b255-aa03c8d67dce">Secrets of the Super Agers</a></p></li></ul><p><strong>2. Add more sources than you think you need &#8212; and let NotebookLM find them</strong></p><p>One document produces one-document results. A YouTube lecture, two articles, and a PDF on the same topic produces something much richer &#8212; the AI can find connections and disagreements across sources that you wouldn&#8217;t catch reading them separately.</p><p>Here&#8217;s the part most people miss: you don&#8217;t have to find the sources yourself. Hit the <strong>Discover</strong> button in the Sources panel, describe what you&#8217;re trying to learn, and NotebookLM searches the web and returns curated sources with annotated summaries. Add the ones that look useful with one click. That&#8217;s how I built the notebook backing the research in this article &#8212; I described the topic, let it do the research, and had a solid set of sources in a few minutes.</p><p><em>[&#128279; You can explore the full notebook here: <a href="https://notebooklm.google.com/notebook/cba7293b-896a-4958-87a7-230a2cedd6bb">The Learning Styles Myth</a>]</em></p><p><strong>3. Try the Audio Overview first</strong></p><p>It&#8217;s the fastest way to understand what NotebookLM pulled out as the key ideas. Even if you don&#8217;t normally listen to things, run it once before generating anything else. It surfaces connections and frames the material in a way that makes every subsequent output more useful.</p><p><em>[&#127911; Listen: Audio Overview &#8212; The Learning Styles Myth]</em></p><div class="native-audio-embed" data-component-name="AudioPlaceholder" data-attrs="{&quot;label&quot;:null,&quot;mediaUploadId&quot;:&quot;d198e30e-ace3-4d41-975c-ab496d52e4dc&quot;,&quot;duration&quot;:1558.1519,&quot;downloadable&quot;:false,&quot;isEditorNode&quot;:true}"></div><p><strong>4. Don&#8217;t stop at one format</strong></p><p>This is the tip that changes how you use the tool. Generate the Audio Overview. Then generate the Mind Map. If the content is complex, try the Cinematic Video. The learning styles research says picking your &#8220;type&#8221; doesn&#8217;t help. The Dual Coding research says layering formats does. Use both.</p><p><em>[&#128506;&#65039; Mind Map &#8212; Key concepts from the research]</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_!payx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!payx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png 424w, https://substackcdn.com/image/fetch/$s_!payx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png 848w, https://substackcdn.com/image/fetch/$s_!payx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png 1272w, https://substackcdn.com/image/fetch/$s_!payx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!payx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png" width="1456" height="1099" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1099,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:709818,&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://trond.ai/i/192381118?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.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_!payx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png 424w, https://substackcdn.com/image/fetch/$s_!payx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png 848w, https://substackcdn.com/image/fetch/$s_!payx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png 1272w, https://substackcdn.com/image/fetch/$s_!payx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F820e208d-a746-4b74-aab8-2a05d0d45c96_4288x3237.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>[&#128202; Infographic &#8212; Beyond the Myth: A Science-Based Guide]</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_!bQk0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bQk0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!bQk0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!bQk0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!bQk0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bQk0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6413955,&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://trond.ai/i/192381118?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bQk0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!bQk0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!bQk0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!bQk0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff357a4eb-67d0-4689-937c-acbc719118a5_2752x1536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>[&#128253;&#65039; Video Overview &#8212; <a href="https://notebooklm.google.com/notebook/cba7293b-896a-4958-87a7-230a2cedd6bb?artifactId=828ce9cb-d57f-44b6-acef-726de066d1b9">Cinematic Video: The Learning Styles Myth</a>]</em></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;6276cef6-ad4d-4817-b653-1e745862bbad&quot;,&quot;duration&quot;:null}"></div><p><em>[&#128209; Slide Deck &#8212; <a href="https://notebooklm.google.com/notebook/cba7293b-896a-4958-87a7-230a2cedd6bb?artifactId=616277c2-f013-4e89-ab34-fd23a2921da2">Download the full presentation</a>]</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://notebooklm.google.com/notebook/cba7293b-896a-4958-87a7-230a2cedd6bb?artifactId=616277c2-f013-4e89-ab34-fd23a2921da2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nkQ5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!nkQ5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!nkQ5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!nkQ5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nkQ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1270770,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://notebooklm.google.com/notebook/cba7293b-896a-4958-87a7-230a2cedd6bb?artifactId=616277c2-f013-4e89-ab34-fd23a2921da2&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://trond.ai/i/192381118?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.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_!nkQ5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!nkQ5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!nkQ5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!nkQ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9264baa1-6ab5-4505-bfe0-f11e27440f80_1376x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>5. Use the Steering Prompt</strong></p><p>Every output in the Studio panel has a customization option before you generate. You can tell NotebookLM to focus on specific sources, approach the topic from a particular angle, or explain things at a certain level. Most people skip this and wonder why the output feels generic. &#8220;Focus on the disagreements between these sources&#8221; produces a completely different Audio Overview than the default. Try it.</p><p><strong>6. Save the good stuff to Notes</strong></p><p>When the chat surfaces an insight worth keeping, save it. Notes live inside your notebook alongside the sources. Your own thinking and the AI&#8217;s synthesis sit in the same place. Over time, the notes become a record of how your understanding of a topic developed &#8212; which is useful in a way that a chat history never is.</p><div><hr></div><h2><strong>The thing my daughter understood</strong></h2><p>She didn&#8217;t ask what kind of learner she was. She made flashcards to test herself and a podcast to listen to while she studied. She layered formats because that&#8217;s what felt right, and it turns out the science agrees with her instincts.</p><p>NotebookLM is good at a lot of things. The Cinematic Video is genuinely amazing &#8212; watch the embed above if you haven&#8217;t yet. The Mind Map makes complex source material navigable in a way that&#8217;s hard to describe until you&#8217;ve dragged a branch around and watched the rest reorganize.</p><p>But none of that is the point. The point is that the same information can be made useful in a dozen different ways, and most of us have been stuck with one or two of them our whole lives.</p><p>My daughter had a quiz to pass. She figured out how to prepare for it. You can do the same thing with whatever&#8217;s on your plate. Big sales call? Load up the client&#8217;s annual reports. Job interview? Drop in the job description and let Discover find you prep material. Presentation next week? Paste in your notes, record a voice brain dump, and watch it turn into slides. Even if it only breaks the writer&#8217;s block, that&#8217;s worth it.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/what-my-daughter-taught-me-about?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/what-my-daughter-taught-me-about?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/what-my-daughter-taught-me-about?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p>So, what are you trying to understand right now? Have you tried more than one format yet? I&#8217;m curious what you&#8217;re hoping to learn and what works for you!</p><p>&#8212; T</p>]]></content:encoded></item><item><title><![CDATA[It's awkward watching agents use computers]]></title><description><![CDATA[We need a new OS built for agents]]></description><link>https://trond.ai/p/its-awkward-watching-agents-use-computers</link><guid isPermaLink="false">https://trond.ai/p/its-awkward-watching-agents-use-computers</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 24 Mar 2026 14:27:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aANG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aANG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aANG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aANG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aANG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aANG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aANG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:850655,&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://trond.ai/i/191948045?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.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_!aANG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aANG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aANG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aANG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a82b6f-5dd6-480f-99e4-0e736477f495_1376x768.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I had lunch with my friend Ronny at work a few weeks ago and we were (shocker!) talking about AI. Specifically, we were talking about how AI is absorbing more of the daily computing tasks that used to require a person sitting at a screen. Scheduling, research, drafting, monitoring, summarizing. The list grows every month.</p><p>That led us to a question: if AI agents are becoming the primary operators of computing systems, what happens to all the infrastructure we built so that <em>humans</em> could operate them?</p><p>Because that&#8217;s what operating systems actually are. They&#8217;re abstraction layers. Decades of engineering spent translating machine reality into something a human mind can understand. File systems, because humans think in containers and locations. Graphical interfaces, because humans perceive visually. Process scheduling, because humans experience time linearly. Every design decision in Unix, Windows, Android, ChromeOS and MacOS encodes endless assumptions about who&#8217;s sitting at the controls.</p><p>But what if the operator we&#8217;re building for is no longer a human?</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2><strong>15,000 tokens per second</strong></h2><p>Let&#8217;s take a quick aside. There is a company called Taalas who has recently built an app called <a href="https://chatjimmy.ai/">Chat Jimmy</a>. It&#8217;s a demonstration of their main business: building AI models compiled directly into custom silicon. Not software inference running on a general-purpose chip. The model <em>is in the computer</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_!kn7K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kn7K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!kn7K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!kn7K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!kn7K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kn7K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2375756,&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://trond.ai/i/191948045?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kn7K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!kn7K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!kn7K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!kn7K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09873902-4950-421d-a2fe-e7b0e6207a11_2752x1536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Chat Jimmy operates consistently above 15,000 tokens per second. For context, human speech runs at roughly 3 tokens per second. At 15,000 tokens per second, an agent can reason through a complex problem, take multiple actions, and produce a result before a human has finished reading the first sentence of the last response. The inference bottleneck for most computing tasks totally disappears.</p><p>If we can get hardware of this nature to a place where local models operate at similar speeds, something shifts with on-device models. They become the computer. And we don&#8217;t have an OS built for that world yet.</p><div><hr></div><h2><strong>The big inversion</strong></h2><p>It won&#8217;t be trivial to get 15k tokens per second running on a device you keep on your desk, but it will happen. And it&#8217;ll signal a shift in how we work. At current inference speeds, agents wait on compute. The OS doesn&#8217;t matter much because the model is the slow part. Get the model fast enough and the calculus flips. The agent isn&#8217;t waiting on the model. The model is waiting on the human. I already see some of this happening today.</p><p>Humans will be the rate-limiting constraint on our systems.</p><p>That&#8217;s a completely different world to design for. An operating system doesn&#8217;t need to be optimized for human-speed interaction anymore. It needs to be optimized for machine-speed agents that are supervised by humans who still move at human speed. Safety, reversibility, and trust enforcement become <em>the</em> central design problem.</p><p>I don&#8217;t think anyone has asked what an OS designed for this user inversion would look like yet.</p><div><hr></div><h2><strong>A sketch of the stack</strong></h2><p>I&#8217;ve been thinking about this question and sketching out an architecture that could be interesting. By no means is this thoroughly thought through, so think of it like an outline for what might work. If you&#8217;ve thought about this as well or have some ideas, reach out &#8212; I&#8217;d love to chat.</p><p><strong>Layer 0: Linux kernel.</strong> Start here and keep it. It handles hardware, networking, and process isolation. These are solved problems not worth re-solving. You can add eBPF programs on top to enforce capability rules at the kernel boundary. No kernel fork required.</p><p><strong>Layer 1: Hardware model.</strong> An on-device LLM minted into silicon that&#8217;s always on, always available, near-zero latency. The runtime talks to this chip in natural language. That&#8217;s not a poetic choice. If the model is the chip and human language is its instruction set, then system calls are just English. Every operation in the audit log is human-readable by default. LLMs printed into chips will have knowledge gaps, so this layer gets augmented with an online model for some tasks &#8212; but we&#8217;ll handle that later.</p><p><strong>Layer 2: Agent runtime.</strong> This is the interesting layer. It replaces all of traditional user space. It&#8217;s the part of the stack that exists to mediate between the machine and a human user. Instead of mediating for humans, it manages agents: their context windows, their tool access, their permissions, their lifecycle.</p><p>A few key jobs it handles:</p><ul><li><p><em>Context management.</em> An agent&#8217;s working memory is its context window, not just RAM. The OS manages context as a first-class resource &#8212; what gets evicted, summarized, or persisted across sessions.</p></li><li><p><em>Tools instead of syscalls.</em> Instead of a syscall table, a tool registry. Agents call tools. The registry knows what each tool does, whether it&#8217;s reversible, what it costs, and whether human approval is required before execution.</p></li><li><p><em>Capabilities instead of permissions.</em> Unix permissions are a file ownership model. That&#8217;s not the right primitive for agents. We need something closer to structured, delegatable, auditable capabilities.</p></li><li><p><em>Reversibility as infrastructure.</em> Right now, every application that wants undo has to build it from scratch. An agent OS should make reversibility a first-class primitive. A staging area for irreversible actions that waits for explicit human approval before executing. At 15,000 tokens per second, mistakes accumulate fast.</p></li></ul><p><strong>Layers 3 and 4: Specialist models and agents.</strong> Specialist models load on demand above the runtime &#8212; like kernel modules for specific domains: code, vision, planning. Above that, agents run as goal-oriented processes rather than session-bound apps. This is where we can add online models to overcome the natural knowledge gap of an LLM printed to silicon.</p><div><hr></div><h2><strong>I&#8217;ve seen this movie before</strong></h2><p>One of my first jobs at Google was helping build ChromeOS. I know a little about what it takes to rethink an operating system. ChromeOS asked: what could an OS be if the web browser were the only app? The answer was a much more efficient system. Strip away 40 years of complexity built to run native applications. Boot in 8 seconds. Let the browser do everything else.</p><p>Today we&#8217;re in a similar spot, asking a similar question: what would an OS need to be if you built the whole thing for AI agents instead of people?</p><p>I work next to people building the next generation of operating systems and I haven&#8217;t even asked them about this. Partly because what I&#8217;m sketching is a thought experiment, and I didn&#8217;t want anyone else&#8217;s answers to constrain mine. The Android and ChromeOS teams have something in development called Aluminum &#8212; I don&#8217;t know what&#8217;s in it, and this isn&#8217;t that.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F6Rx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F6Rx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!F6Rx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!F6Rx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!F6Rx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F6Rx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2556260,&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://trond.ai/i/191948045?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F6Rx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!F6Rx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!F6Rx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!F6Rx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db40050-61d3-4d0d-af9e-db0f628709fe_2752x1536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What I do think is clear: every company building an OS right now is trying to figure out how to add AI into it. But the answer we&#8217;re looking for isn&#8217;t an existing paradigm with AI bolted on. It isn&#8217;t ChromeOS or MacOS or Android with a chat window. It&#8217;s something designed from scratch around the assumption that the thing doing the computing is an agent, and the human is there to supervise and interact with it &#8212; not to drive all the details of making it work.</p><p>That&#8217;s a different OS than anything that exists today.</p><div><hr></div><h2><strong>Why does this matter now?</strong></h2><p>The window is specific to this moment. Every day another AI system announces more capabilities for computer use: schedules, remote access, browser automation, skills, MCP servers. All of these systems designed so agents can pretend to operate like people. We&#8217;re forcing computers to pretend to behave like humans in order to do things on computers. It&#8217;s a strange layer of friction we keep injecting because we&#8217;re using a wrench to hammer a nail.</p><p>At the same time, local inference is still too slow to run capable agents on-device for everything a modern OS relies on. Even the newest Qwen models on a tricked-out Mac Studio fall short of what we need for agents to run all of the details of these systems continuously. Until we close that gap, agents live in the cloud, on human-designed infrastructure, using agent harnesses to drive systems built for people.</p><p>Before long these constraints will be gone. Chips will hit 15,000 tokens per second and will run efficiently on your laptop. Then on your phone. Then on your headphones. Local capable agents will become practical on every device. And everyone who wants to run those agents needs an OS built specifically to maximize that experience, or we&#8217;ll keep absorbing friction translating from computer to human and back to computers.</p><p>When that OS exists, it will shape what agents can do and how safe they are. If we keep heading down the road we&#8217;re on with defaults of agents running on Linux and Windows &#8212; systems with no concept of a tool registry, no capability model for autonomous action, no staging area for irreversible decisions &#8212; we&#8217;re headed for problems.</p><p>The time to design this is before the hardware arrives. After it arrives, you&#8217;re retrofitting. Or maybe the agents will just do it themselves.</p><div><hr></div><h2><strong>What&#8217;s left to ponder?</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zoAr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zoAr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zoAr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zoAr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zoAr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zoAr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:389928,&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://trond.ai/i/191948045?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.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_!zoAr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zoAr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zoAr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zoAr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9b0c626-68c9-4bdb-8748-30ac96b5dbf4_1376x768.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Because I&#8217;m using this as a way to write-to-think, I&#8217;m very much missing a lot of detail. A few gaps I&#8217;m genuinely curious about:</p><p><strong>The Tensor question.</strong> Google&#8217;s Tensor chips already do pretty impressive on-device Gemini Nano inference. Is it close enough to what Layer 1 needs, and how well-suited is this approach to being what we want exposed to software? This matters for whether we&#8217;re talking about new silicon or new software on existing silicon.</p><p><strong>The safety research.</strong> The capability and reversibility model I&#8217;ve sketched is conceptually interesting, but I don&#8217;t know how much formal work exists on verifying capability systems for LLM agents. This is probably a known problem in security research that I haven&#8217;t fully worked through yet.</p><p><strong>The device form factor.</strong> A personal AI server &#8212; a small always-on box that runs your agents locally &#8212; seems like a natural first hardware expression of this. But I&#8217;m not sure if that&#8217;s the right starting point, or if this begins as a server product and migrates to the edge over time. What do you think?</p><div><hr></div><p>I find this compelling enough to think more about, which is why I wrote it down.</p><p>If you&#8217;re working on any part of this stack &#8212; hardware, runtime, capabilities, reversibility &#8212; I&#8217;d love to know. And if I&#8217;ve missed something obvious, tell me. What&#8217;s the right device form factor for this? Does it start in your living room, or in a data center?</p><p>&#8212; T</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Make your AI agent work while you sleep]]></title><description><![CDATA[A step-by-step guide anyone can follow to build rad shit with proactive AI agents]]></description><link>https://trond.ai/p/make-your-ai-agent-work-while-you</link><guid isPermaLink="false">https://trond.ai/p/make-your-ai-agent-work-while-you</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 10 Mar 2026 15:21:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Fpjv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fpjv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fpjv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Fpjv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Fpjv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Fpjv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fpjv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8137768,&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://trond.ai/i/190474074?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Fpjv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Fpjv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Fpjv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Fpjv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cccd05-38ba-446b-a32a-79dea1937b96_2752x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One of my readers sent me an email last week with the subject line &#8220;<em>Building Semi-Rad Shit</em>.&#8221;</p><p>He&#8217;d been inspired by something I wrote and stayed up late putting it to work. He trained Gemini to review solar site title insurance exceptions. Then he had it pull utility hosting capacity maps, find available parcels, and cross-reference them against where the grid has room. A list of viable solar development sites, ranked by proximity to power lines. In a few hours.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><blockquote><p>&#8220;Last time I did site identification a few years ago,&#8221; he wrote, &#8220;I pulled the map data off the utility website into a database, then matched it with parcel data from each county by hand... this time I got a solid list in only a few hours!&#8221;</p></blockquote><p>Then, near the bottom of his email, he hit the wall.</p><blockquote><p>&#8220;It&#8217;s a little annoying that I can&#8217;t just have it do things offline, and it can&#8217;t send me emails once it&#8217;s done the work periodically.&#8221;</p></blockquote><p>Almost every builder I know hits this wall eventually. You do something impressive with AI, you see what&#8217;s possible, and then you realize: your AI only works when you&#8217;re there asking it questions. It goes to sleep the moment you close the tab.</p><p>This post is about how to take that next leap with AI.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2><strong>The gap between an assistant and an agent</strong></h2><p>Most AI tools are reactive. You prompt, they respond. You close the tab, they stop existing. That&#8217;s useful. But it&#8217;s not the same as having something working <em>for</em> you all the time.</p><p>A proactive agent is different in one specific way: it has a schedule. It wakes up, does a job, and reaches out to you if it finds something it needs your input on. If nothing&#8217;s worth saying, you hear nothing. You only know it&#8217;s running because, every so often, your phone buzzes with something that is worthy of your attention.</p><p>The first time that happens something profound clicks.</p><p>The good news is that three ingredients are all you need:</p><ol><li><p><strong>A schedule:</strong> a system to trigger your agent at regular intervals</p></li><li><p><strong>A task:</strong> a specific job with clear instructions about what to do each time</p></li><li><p><strong>A way to reach you:</strong> configuration for a chat message or an email</p></li></ol><p>Everything else is implementation details.</p><div><hr></div><h2><strong>Introducing OpenClaw</strong></h2><p>The most popular tool right now for building these sorts of agents is <a href="https://openclaw.ai/">OpenClaw</a>. It&#8217;s a self-hosted AI gateway you run on your own machine. It handles the scheduling, the agent sessions, and the channel connections needed to keep an agent running in a loop. It&#8217;s become very popular lately because it can be configured to do just about anything and has a rapidly growing ecosystem of skills you can use with it.</p><p>It&#8217;s not the only option for this, but it&#8217;s the one I&#8217;ve actually used to build everything I&#8217;m about to describe. It runs on Mac, Linux, any VPS, a Raspberry Pi, or even a Docker container you can run on your main computer. Monthly cost beyond the hardware is just your Anthropic, Gemini or OpenAI API usage. For light-to-moderate agent workloads, this can be had for about $5&#8211;20 per month.</p><p>Let&#8217;s help get you started.</p><div><hr></div><h2><strong>Step 1: Install OpenClaw</strong></h2><p><strong>On a Mac</strong><br>I have my OpenClaw running an a Mac mini I wasn&#8217;t using, so let&#8217;s start with this option. If you&#8217;ve been trying to buy a Mac mini recently and found them out of stock, OpenClaw is part of why. There&#8217;s a wave of people buying them specifically as always-on personal AI servers. The M4 model idles at about 10 watts. Less than a light bulb to keep an agent running around the clock.</p><p>If you&#8217;re using a Mac for OpenClaw you really want to dedicate that device to your setup so it&#8217;s not competing with you for resources. Once you have updates applied and a fresh install, open terminal and run this:</p><pre><code><code>curl -fsSL https://openclaw.ai/install.sh | bash</code></code></pre><p>This one command detects how you system is setup, installs Node if needed, installs OpenClaw, and walks you through the next steps. If you have a Mac ready to go, this is your fastest way to get started.</p><p><strong>On a Virtual Private Server</strong><br>Another popular option is to spin up an inexpensive virtual server (aka a VPS). Hetzner is a good option with their CX22 plan at $4/month. It provides 2 vCPU and 4GB RAM which is plenty for most basic OpenClaw setups. Here&#8217;s how set it up:</p><p><strong>a. Create the server.</strong><br>Go to <a href="https://hetzner.com/">hetzner.com</a>, create an account, and create a new server. Pick <strong>Ubuntu 24.04</strong>, the <strong>CX22</strong> plan, and select a data center near you. When asked about SSH keys, you can skip it and Hetzner will email you a root password &#8212; or if you want to set one up, <a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent">GitHub&#8217;s SSH key guide</a> is the clearest I&#8217;ve found. It&#8217;s worth doing once.</p><p><strong>b. Connect to your new server using SSH.</strong><br>Open terminal and type this:</p><pre><code><code>ssh root@YOUR_SERVER_IP</code></code></pre><p><strong>c. Run the installer.</strong><br>This single command sets up OpenClaw, creates a firewall, configures auto-start on boot, and implements Tailscale for secure remote access:</p><pre><code><code>curl -fsSL https://raw.githubusercontent.com/openclaw/openclaw-ansible/main/install.sh | bash</code></code></pre><p>You don&#8217;t need to know what any of that means. The installer walks you through everything, including how to add your LLM API key (Anthropic, Gemini or OpenAI). Once you finish, you&#8217;ll have a running OpenClaw gateway.</p><p><strong>d. Verify.</strong><br>After setup, you should check that everything is working as expected. You can do that with these commands:</p><pre><code><code>openclaw doctor    # checks for config issues
openclaw status    # confirms the gateway is running</code></code></pre><p><code>gateway: running</code> means you&#8217;re done with this step and ready to go.</p><div><hr></div><h2><strong>Step 2: Connect Telegram</strong></h2><p><a href="https://telegram.org/">Telegram</a> is the fastest way to get your agent talking to you. It&#8217;s free, works everywhere, has no iMessage dependency, and is the default for a reason. Works on every platform, no phone number required.</p><p><strong>2a. Create a bot</strong></p><p>Open Telegram and search for <code>@BotFather</code>. Start a chat and run:</p><pre><code><code>/newbot</code></code></pre><p>Follow the prompts, pick a name and username for your bot. BotFather will give you a token that looks like:</p><pre><code><code>7412938456:AAHdqTgsH8m9a3Xe5lk0mBHZJzwp1234xxcd</code></code></pre><p>Copy that token. You&#8217;ll need it in the next step.</p><p><strong>2b. Add the token to OpenClaw config</strong></p><p>Open your OpenClaw config file (the onboarding wizard tells you where it lives, typically <code>~/.openclaw/config.json5</code>) and add the following to the file. I&#8217;m going to ask you to edit a few text files. If you&#8217;re on a mac, you can open the files in TextEdit which is pre-installed. On a VPS you&#8217;ll need to use vim which is a bit trickier to learn and somewhat unintuitive. Google it and figure it out. I believe in you.</p><p>Anyway, once you figure out how to edit text files add this to the config.json5 file:</p><pre><code><code>{
  channels: {
    telegram: {
      enabled: true,
      botToken: "YOUR_TOKEN_HERE",
      dmPolicy: "pairing",
    },
  },
}</code></code></pre><p>Save the file, then restart the gateway:</p><pre><code><code>openclaw gateway restart</code></code></pre><p><strong>2c. Pair your Telegram account</strong></p><p>Open Telegram and send any message to your new bot. Then back in your terminal:</p><pre><code><code>openclaw pairing list telegram</code></code></pre><p>You&#8217;ll see a pairing code tied to your Telegram user ID. Approve it:</p><pre><code><code>openclaw pairing approve telegram YOUR_CODE</code></code></pre><p>Send another message to your bot. It should respond. That&#8217;s the connection live.</p><div><hr></div><h2><strong>Step 3: Build your first proactive agent</strong></h2><p>The basic setup is ready. Now for the good part.</p><p>A cron job in OpenClaw is just a scheduled task with a natural language prompt. You describe what you want the agent to do, when to do it, and where to send the result. No code.</p><p>Here&#8217;s the exact setup for a monitoring agent, the same pattern I use for a dozen different tasks:</p><pre><code><code>openclaw cron add \
  --name "My First Monitor" \
  --cron "0 */4 * * *" \
  --tz "America/Chicago" \
  --session isolated \
  --message "Check [URL or data source] for [specific condition]. If you find [thing worth reporting], send me a Telegram message at [your Telegram ID] with the details. If nothing has changed or nothing meets the condition, output QUIET and stop. Do not send any message."</code></code></pre><p>The <code>--cron "0 */4 * * *"</code> runs it every 4 hours. <a href="https://crontab.guru/">Crontab.guru</a> is a handy tool for building your own expressions. Some common ones:</p><ul><li><p>Every morning at 7am: <code>"0 7 * * *"</code></p></li><li><p>Every Monday at 8am: <code>"0 8 * * 1"</code></p></li><li><p>Every hour: <code>"0 * * * *"</code></p></li></ul><p><strong>The most important part of the prompt:</strong> tell the agent to be quiet when nothing is worth reporting. <code>output QUIET and stop</code> prevents notification fatigue. You want to hear from it when something matters, not on a schedule.</p><p><strong>For our reader&#8217;s solar use case</strong>, this might look like:</p><pre><code><code>Check the ComEd hosting capacity map at [URL] for any new high-capacity zones 
that weren't in my last report. Cross-reference with parcel data for any lots 
over [n] acres within [m] miles of those zones that are listed for sale. 
If you find new matches, email me with a summary. If nothing new, output QUIET.</code></code></pre><p><strong>But you don&#8217;t need to any of that by hand!</strong> You can literally open Telegram and send your bot a message with the prompt above along with a description of when you want it run and how often. And your brand new agent will do it for you. This is the most important lesson here. Your agent knows how to set itself up and can do just about anything you want it to do from now on. This is why we&#8217;re careful about the machine we give it access to.</p><div><hr></div><h2><strong>Step 4: The AgentMail upgrade</strong></h2><p>Telegram works great for personal alerts. But if you want your agent to send proper emails, or receive emails and act on them, you&#8217;re going to want to add <a href="https://agentmail.to/">AgentMail</a>. I like this service because it&#8217;s built specifically for agents and how we use them securely. You could give your agent access to your personal email, but before you do that I recommend you <em>really</em> understand what you&#8217;re doing so you don&#8217;t bork your personal inbox <a href="https://techcrunch.com/2026/02/23/a-meta-ai-security-researcher-said-an-openclaw-agent-ran-amok-on-her-inbox/">like some people did</a>.</p><p>Once you have it setup AgentMail gives your agent its own inbox. Next is setting up your system so your Agent knows about it&#8217;s new email account. You can install the skill by hand with this command:</p><pre><code><code>clawdhub install agentmail</code></code></pre><p>Then your agent can send from <code>solar-scout@agentmail.to</code> (or whatever you configure), format a proper email report, and drop it in your inbox every Monday morning. It can also receive emails. If you reply to a report, the agent processes your reply and takes action.</p><p>For our reader this is the missing piece. Instead of a Telegram ping, he&#8217;d wake up to a formatted email from his solar scout with a table of new sites, ranked by proximity to capacity, with links to the parcel listings.</p><div><hr></div><h2><strong>What changes</strong></h2><p>The first few days you&#8217;ll keep checking if it worked. Opening the logs, running <code>openclaw status</code>, making sure the cron fired, etc. Then you forget it&#8217;s running.</p><p>A week later your phone might buzz. Your agent found something. Something you would have missed because you weren&#8217;t looking.</p><p>That&#8217;s the shift you need to get comfortable with. Your mindset shifts from &#8220;What can AI do for me?&#8221; to &#8220;How do I make my AI work for me when I&#8217;m not working?&#8221; This is the answer. The initial setup takes 30 minutes. The payoff is an AI that has a job, shows up for it, and only bothers you when it has something worth saying.</p><p>Before long you&#8217;ll be hooked. You&#8217;ll discover you can simply ask your agent to do all sorts of things for you proactively and it&#8217;ll set itself up to make it happen. You&#8217;ll browse <a href="https://clawhub.ai/">clawhub.ai</a> for skills and eventually write your own skills. You&#8217;ll read about how people are doing amazing things with their setups and replicate some of their efforts. It gets fun fast.</p><p>On Sunday, my agent texted me at 7am about sold out Harry Potter tickets for a trip we&#8217;re taking to London. Stella was keeping an eye out for cancellations, so I could pounce if any came available. We didn&#8217;t get the tickets because someone else was faster. That&#8217;s a different problem. But I&#8217;m hopeful I&#8217;ll have another chance.</p><p>What would you have your agent do for you?</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/make-your-ai-agent-work-while-you?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Build Rad Shit! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/make-your-ai-agent-work-while-you?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trond.ai/p/make-your-ai-agent-work-while-you?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div><hr></div><p><em>Builder&#8217;s note: The OpenClaw docs are at <a href="https://docs.openclaw.ai/">docs.openclaw.ai</a> and the community is active on <a href="https://discord.com/invite/clawd">Discord</a> if you get stuck. If you end up building something like solar scout, I want to hear about it.</em></p><div><hr></div><p><em>Trond Wuellner builds things at Google Labs and writes about what he learns. If this was useful, forward it to someone who&#8217;d appreciate it.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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://trond.ai/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[How to Build Your First Rad Thing]]></title><description><![CDATA[A brief guide on how to get started building your first thing using AI.]]></description><link>https://trond.ai/p/how-to-build-your-first-rad-thing</link><guid isPermaLink="false">https://trond.ai/p/how-to-build-your-first-rad-thing</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Mon, 02 Mar 2026 16:18:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6XKh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I spent last weekend in Whistler with a group of friends from business school. Solar entrepreneurs, VC partners, leaders at Apple and Google. An entrepreneur who sold his last company and now runs a business distributing wild game in Sweden and Europe.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6XKh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6XKh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6XKh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6XKh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6XKh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6XKh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.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;:null,&quot;bytes&quot;:1245848,&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://trond.ai/i/189619933?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.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_!6XKh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6XKh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6XKh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6XKh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdad70e0e-82e7-4eb4-8ed8-6afe9a6e0ad3_3456x1944.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Smart people. All of them.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Every single one has played with ChatGPT. Most use it regularly. And when I described what I&#8217;ve been building: AI assistants that manage my family&#8217;s calendar, generate math worksheets for my kids, call restaurants on my behalf, monitor my house. They all had the same look. Not skepticism. More of an eagerness to dive in to figure out where these tools might help them at home and at work.</p><blockquote><p>&#8220;Okay but how do you actually start?&#8221;</p></blockquote><p>That&#8217;s what this is. The answer to that question. Not theory or hype. A step-by-step guide for someone who understands their business, isn&#8217;t afraid of technology, and is ready to go from curious to building.</p><p>This is my favorite part of this moment we&#8217;re living in. You don&#8217;t need to be a developer. You need to be willing to try and eager to learn. This guide is for you.</p><div><hr></div><h2><strong>The Decision</strong></h2><p>Before you install anything, understand what you&#8217;re actually signing up for.</p><p>Building with AI coding tools is not like using ChatGPT. You&#8217;re not typing questions and copying answers. You&#8217;re setting up an ongoing collaboration with a system that writes code, runs commands on your computer, reads your files, searches the web, and iterates based on your feedback.</p><p>And the output isn&#8217;t always software in the traditional sense. It might be an automated workflow, a document processor, a report generator, or a tool that monitors your inbox and surfaces what matters. If it involves information and repetition, these tools can help.</p><p>It&#8217;s closer to hiring a junior developer than using a search engine. A very fast, very capable junior developer who has read most of the internet but has no context about your specific situation.</p><p>Your job is to provide that context. To ask good questions. To review what it builds and tell it what to change. You don&#8217;t need to understand every line of code it writes. You need to understand what you want, and be able to recognize when you&#8217;re getting it.</p><p>That&#8217;s it. That&#8217;s the skill.</p><p>The tools do the rest.</p><div><hr></div><h2><strong>A Word on Cost</strong></h2><p>Before you install anything: check what you already have.</p><p>A lot of people are already paying for access to these tools without realizing it.</p><ul><li><p><strong>Google Workspace</strong> Business Standard and above includes Gemini built in: summarization in Gmail, Docs, Sheets, and more. Check with your IT admin or look in your Google account under the Gemini icon.</p></li><li><p><strong>ChatGPT Plus</strong> ($20/month) includes Codex. If you&#8217;re already subscribed, you&#8217;re in.</p></li><li><p><strong>Microsoft 365</strong> offers Copilot as a paid add-on, but if your company has rolled it out, you may already have access to some of these capabilities.</p></li></ul><p>If you have any of these, start with what you have before buying anything new.</p><p><strong>If you need to pay, subscriptions are almost always the better choice.</strong> The $20/month plans (<a href="https://claude.com/pricing">Claude Pro</a>, <a href="https://openai.com/chatgpt/pricing">ChatGPT Plus</a>, <a href="https://one.google.com/about/plans">Google AI Pro</a>) give you predictable costs, generous limits, and the most capable models. For most people, a subscription goes further than pay-per-use at the same price.</p><p>The higher tiers, Claude Max ($100-200/month) and ChatGPT Pro ($200/month), are worth it once you&#8217;re using these tools daily and want priority access, maximum limits, and the fastest responses. Think of it like a SaaS tool: pay for the plan that matches your usage.</p><p>The pay-per-use API is powerful but unpredictable. Claude Code can run $20-50 in a single day on a large project without you noticing. It makes sense eventually, especially for automated workflows that run without you. It&#8217;s not where you want to start.</p><p><strong>The progression that makes sense:</strong></p><ol><li><p>Check if you already have access (Workspace, ChatGPT Plus, Microsoft 365)</p></li><li><p>Start with a free tier (Gemini CLI, Antigravity) to get comfortable</p></li><li><p>Upgrade to a $20/month subscription when you&#8217;re ready to go deeper</p></li><li><p>Move to higher tiers ($100-200/month) if you&#8217;re using it every day</p></li><li><p>Add pay-per-use API access only when you&#8217;re building automated workflows that run on their own</p></li></ol><div><hr></div><h2><strong>Pick Your Tool</strong></h2><p>There are essentially three tools worth using right now. They all do roughly the same thing: AI-assisted coding and automation. Different providers, each with different strengths.</p><p>All have desktop apps to get you building without touching a terminal. Claude&#8217;s desktop app includes a Code tab (Claude Code with a visual interface) and Cowork, an autonomous mode where Claude acts on files in a folder you authorize. Codex has a standalone app. Google&#8217;s Antigravity IDE is free and helpful for getting started quickly.</p><p>Pick the tool that matches what you already have access to. You can always change later. We&#8217;re just finding the right path to get you started today.</p><p><strong>My simple point of view:</strong></p><p>Start with what you already pay for. ChatGPT Plus gives you Codex. Google Workspace gives many people Gemini Pro. Check what you already have before you buy anything.</p><p>If you&#8217;re starting from zero: Antigravity (Google&#8217;s IDE) is free, polished, and requires no terminal. Gemini is especially good if your project involves reading lots of documents, emails, or spreadsheets; which is a bonus.</p><p>Codex is the natural choice if you already use ChatGPT Plus. You&#8217;re already paying for it. Just start there.</p><p>I generally start most projects with Antigravity, but I also love what Claude can do even though it requires a subscription. Their desktop app is quite impressive. The Code tab handles most coding tasks beautifully, and Cowork (included from Pro and above) takes it to another level. It reasons more carefully than the others, handles nuance well, and is often the most honest about what it doesn&#8217;t know. Worth it once you&#8217;re willing to add another subscription to your monthly nut.</p><p>You don&#8217;t have to pick just one. You&#8217;ll learn what you prefer as you start building and can easily change later.</p><div><hr></div><h2><strong>Install It: Step by Step on Mac</strong></h2><h3><strong>Option A: Gemini (Google)</strong></h3><p><strong>The easy way: Antigravity</strong></p><p>Google released an agent-first IDE called <a href="https://antigravity.google/download">Antigravity</a> in late 2025. It&#8217;s free and runs Gemini models under the hood. The standout feature: a &#8220;Manager View&#8221; that orchestrates multiple AI agents in parallel across your editor, terminal, and browser. Think Mission Control for coding tasks. Download it like any Mac app, sign in with your Google account, and you&#8217;re building in minutes.</p><p><strong>The power-user way: CLI</strong></p><p>The Gemini CLI unlocks its biggest advantage: the ability to read enormous amounts of text at once. Useful for projects involving lots of documents, emails, or large codebases.</p><pre><code><code>brew install node
npm install -g @google/gemini-cli
gemini</code></code></pre><p>On first run it opens a browser window for Google sign-in. That&#8217;s the whole setup. For the most powerful model:</p><pre><code><code>gemini -m gemini-pro-latest</code></code></pre><div><hr></div><h3><strong>Option B: Claude (Anthropic)</strong></h3><p><strong>The easy way: desktop app</strong></p><p>Download the Claude desktop app at <a href="https://claude.com/download">claude.com/download</a>. Free to download, works on Mac and Windows. Sign in with your Anthropic account and you get two modes worth knowing about:</p><ul><li><p><strong>Code tab:</strong> a graphical interface for Claude Code. You get visual diff review, live previews of what you&#8217;re building, and the ability to run multiple tasks in parallel, all without touching the terminal. This is Claude Code with a UI on top.</p></li><li><p><strong>Cowork:</strong> a research preview (Pro and above) where Claude autonomously acts on files in a folder you authorize. Think of it as giving Claude a desk of its own: it can organize documents, build spreadsheets from receipts, draft reports. You review and confirm significant changes.</p></li></ul><p>For most people starting out, the Code tab is the right place to begin.</p><p><strong>The power-user way: CLI</strong></p><p>The terminal version is one line to install:</p><pre><code><code>curl -fsSL https://claude.ai/install.sh | bash</code></code></pre><p>After it finishes, just run:</p><pre><code><code>claude</code></code></pre><p>Sign in with your Anthropic account. You&#8217;ll need a <a href="https://claude.com/pricing">Pro or Max subscription</a> (starting at $20/month), or an API key from <a href="https://console.anthropic.com/">console.anthropic.com</a> to pay by usage instead. The CLI and the desktop app share the same config, including your <code>CLAUDE.md</code> files, so you can move between them freely.</p><div><hr></div><h3><strong>Option C: Codex (OpenAI)</strong></h3><p><strong>The easy way: Codex app</strong></p><p>OpenAI has a standalone Codex app at <a href="https://openai.com/codex">openai.com/codex</a>. Purpose-built for coding tasks. If you already pay for <a href="https://openai.com/chatgpt/pricing">ChatGPT Plus</a> ($20/month), you have access.</p><p><strong>The power-user way: CLI</strong></p><pre><code><code>brew install node
npm install -g @openai/codex
export OPENAI_API_KEY="your-key-here"
codex</code></code></pre><p>Get your API key at <a href="https://platform.openai.com/">platform.openai.com</a> &#8594; API Keys &#8594; Create Key.</p><div><hr></div><h2><strong>Your First Session: What You&#8217;ll Actually See</strong></h2><p>Here&#8217;s what you&#8217;ll actually see when you open each tool for the first time.</p><h3><strong>If you&#8217;re using Antigravity (Google)</strong></h3><p>When Antigravity opens you&#8217;ll see two views in the sidebar: <strong>Editor</strong> and <strong>Manager</strong>.</p><p>Start in <strong>Editor</strong>. It looks like a code editor: a big panel on the left for files, a writing area in the center, and a chat panel on the right. That chat panel is where you talk to the AI. You don&#8217;t need to touch the file panel or the code. Just focus on the chat.</p><p>To open your project: File &#8594; Open Folder &#8594; navigate to your project folder (Desktop or Documents is fine) and select it. Your files appear in the left panel. Now when you talk to the AI, it can see and edit those files directly.</p><p>Type your first message in the chat panel on the right. The AI responds, makes changes to your files, and shows you what it did. In a moment, we&#8217;ll show you what to type in that chat box!</p><h3><strong>If you&#8217;re using the Claude desktop app</strong></h3><p>When it opens you&#8217;ll see a clean interface with a chat window in the center. At the top you&#8217;ll see tabs: <strong>Chat</strong>, <strong>Code</strong>, and (on Pro and above) <strong>Cowork</strong>.</p><p>Click <strong>Code</strong>. You&#8217;ll see a chat interface similar to the regular Claude chat, but with file access. Click the folder icon or go to File &#8594; Open Project to point it at your project folder. The AI can now read and edit files in that folder.</p><p>Type your message in the chat box at the bottom. The AI responds in the main window, shows you code changes with visual diffs (highlighted additions and deletions), and asks for confirmation before editing files.</p><h3><strong>If you&#8217;re using Claude Code in the terminal</strong></h3><p>After running <code>claude</code>, you&#8217;ll see a prompt that looks like this:</p><pre><code><code>Claude Code (claude-opus-4-5)
Type a message or /help for commands
&gt;</code></code></pre><p>Navigate to your project folder first:</p><pre><code><code>cd ~/Desktop/my-project
claude</code></code></pre><p>Full Claude Code docs at <a href="https://code.claude.com/docs/en/overview">docs.anthropic.com/claude-code</a>.</p><p>Now type your message at the <code>&gt;</code> prompt. The AI responds inline, shows you the files it&#8217;s changing, and asks your permission before modifying anything.</p><div><hr></div><h3><strong>If you&#8217;re using the Codex desktop app</strong></h3><p>When Codex opens you&#8217;ll see a <strong>Projects panel</strong> on the left and a main area on the right. Projects are how Codex organizes your work: each project points to a folder on your computer (or a GitHub repo, if you have one).</p><p>To get started: click <strong>New Project</strong>, give it a name, and point it at your project folder. Codex loads the files and you&#8217;re ready.</p><p>The main area shows <strong>Threads</strong>: each thread is a task you&#8217;ve given to an AI agent. Think of threads like chat conversations, except instead of just answering, the AI is actively editing files and running code in the background. You can have multiple threads running at once, each working on a different thing.</p><p>Type your first message in the input box at the bottom of the main panel. The AI picks it up as a new thread, starts working, and shows you what it&#8217;s doing in real time: which files it&#8217;s reading, what changes it&#8217;s making, whether the code ran successfully. When it&#8217;s done, you&#8217;ll see a diff &#8212; a summary of what changed &#8212; and you can approve it, ask for changes, or open the result in your own editor.</p><p>One thing worth knowing: Codex is built for <strong>parallel work</strong>. You can kick off one task, then start another while the first is still running. Each stays in its own thread. Genuinely useful once you have more than one thing to build at once. For your first session, just start one thread and get a feel for the loop before you try running multiple.</p><div><hr></div><h3><strong>The big thing most people don&#8217;t realize</strong></h3><p>You don&#8217;t need to know how to run code. In all three tools, the AI runs the code itself. You ask it to build something, it builds it, runs it to check it works, shows you the result, and tells you if anything went wrong. Your job is to tell it what you want and give feedback on what you see.</p><p>If the AI produces a script you need to run yourself, it will tell you exactly what to type. Copy it. Paste it. Run it. That&#8217;s the full extent of what you need to know.</p><h3><strong>On permissions and trust</strong></h3><p>One thing that catches people off guard: these tools ask for your approval constantly. Before editing a file, before running a command, before accessing the internet: you&#8217;ll see a prompt asking if it&#8217;s okay to proceed.</p><p>Often you won&#8217;t know exactly what it&#8217;s asking. The command it wants to run might look like gibberish. You&#8217;re faced with a choice: trust the system and say yes, or stop and ask what it means before proceeding.</p><p>Here&#8217;s a rough guide to what&#8217;s routine and what deserves a pause:</p><p><strong>Generally fine to approve:</strong></p><ul><li><p>Reading or editing files inside your project folder</p></li><li><p>Running the code it just wrote</p></li><li><p>Installing packages or dependencies (it needs these to build things)</p></li><li><p>Creating new files in your project</p></li></ul><p><strong>Worth a moment&#8217;s thought:</strong></p><ul><li><p>Making network requests or calling external APIs: ask what it&#8217;s connecting to and why</p></li><li><p>Deleting files: make sure you know what&#8217;s being removed</p></li><li><p>Commands that reference folders outside your project: why does it need to go there?</p></li><li><p>Anything involving credentials, API keys, or passwords: confirm it&#8217;s not storing these somewhere unexpected</p></li></ul><p><strong>Decline and ask questions:</strong></p><ul><li><p>Anything with <code>sudo</code> (administrator access) that the task clearly doesn&#8217;t require</p></li><li><p>Commands touching sensitive system locations you didn&#8217;t direct it toward</p></li><li><p>Sending data to a service you didn&#8217;t set up or recognize</p></li></ul><p>When in doubt: if a command looks completely alien, type &#8220;explain exactly what this does in plain English before running it.&#8221; The AI will walk you through it. You&#8217;ll either feel confident to proceed, or you&#8217;ll catch something that shouldn&#8217;t happen.</p><p>Once you trust the project and want to stop approving every small action, Claude Code has an answer: <strong>yolo mode</strong>. Type <code>/yolo</code> in the chat. It skips permission prompts for the session. Your files are still there, changes are still visible, and you can undo. It just means you&#8217;ve decided to let the AI work without interruption. Most people switch to it once a project is underway and they understand what the AI is doing.</p><div><hr></div><h2><strong>Setting Up Your First Project</strong></h2><p>Every project starts the same way: a folder and a briefing file.</p><p><strong>If you&#8217;re using a desktop app (Antigravity, Codex or Claude):</strong> Create a folder anywhere. Desktop or Documents is fine. Name it something descriptive. Then open it in the app. That&#8217;s your project.</p><p><strong>If you&#8217;re using the terminal:</strong> Create the folder and navigate into it:</p><pre><code><code>mkdir ~/Desktop/my-project
cd ~/Desktop/my-project</code></code></pre><p>The briefing file is called <code>AGENTS.md</code>. Think of it as permanent memory for your project: context the AI reads at the start of every session so you never have to re-explain from scratch. Claude Code reads <code>CLAUDE.md</code> natively, and most other AI coding tools are converging on <code>AGENTS.md</code> as the shared standard. Using <code>AGENTS.md</code> means every tool picks it up automatically.</p><p><strong>A quick note on the .md file format.</strong> These files are written in a format called Markdown: a simple way of formatting plain text using symbols like <code>#</code> for headings and <code>-</code> for bullet points. You&#8217;ve probably seen it without knowing it. The AI reads it perfectly, and it&#8217;s easy to write once you&#8217;ve seen an example.</p><p>Macs don&#8217;t come with a great Markdown editor by default. A few good options:</p><ul><li><p><strong><a href="https://bear.app/">Bear</a>:</strong> Mac-native, beautiful, free to start. The one I&#8217;d start with.</p></li><li><p><strong><a href="https://obsidian.md/">Obsidian</a>:</strong> free, powerful, worth it if you want your notes and projects in one place.</p></li><li><p><strong><a href="https://code.visualstudio.com/">VS Code</a>:</strong> free, already installed if you&#8217;re using Antigravity (it&#8217;s built on the same base), and has Markdown preview built in.</p></li></ul><p>Again, remember that you can always <strong>just ask the AI to create the file for you.</strong> After the interview, say &#8220;Based on what we just discussed, create an AGENTS.md file for this project.&#8221; It will write the whole thing correctly. If you want, you can open it in Bear or Obsidian to review and tweak.</p><p><strong>Seriously, don&#8217;t start from scratch.</strong> The community has built templates you can copy. Just use those as a starting point, they&#8217;re going to be better than whatever you&#8217;ll do at first:</p><ul><li><p><strong><a href="https://github.com/agentsmd/agents.md">agentsmd/agents.md</a>:</strong> The simplest, most widely-adopted template.</p></li><li><p><strong><a href="https://github.com/davila7/claude-code-templates">davila7/claude-code-templates</a>:</strong> Ready-to-use configurations with working examples.</p></li></ul><p>Here&#8217;s a starting point if you absolutely want to roll your own:</p><pre><code><code># AGENTS.md

## What This Project Is
[One paragraph: what it does and why it exists]

## Who Uses It
[Describe the person this is built for]

## Current Status
[What's done, what's in progress, what's next]

## Important Constraints
[Things the AI must never do, hard requirements, known limitations]

## Style and Standards
[How you want things done: tone, format, patterns to follow consistently]</code></code></pre><p>You don&#8217;t need to fill in every section before you start. The first two are enough to begin. The AI will help you figure out the rest as you go.</p><p>The Style and Standards section is the most underrated part. Tell the AI once how you want things done, and it applies that consistently every session. You stop correcting the same things over and over.</p><p><em>One note on naming</em>: <code>AGENTS.md</code> works across most tools. If you&#8217;re using Claude, it reads a file called <code>CLAUDE.md</code> instead. That file has the same purpose and works the same way but they don&#8217;t use the common naming scheme as everyone else. Sigh.</p><p><strong>Starting every session, your opening message:</strong></p><pre><code><code>Please read AGENTS.md to get context on this project, then tell me what you understand and what questions you have before we continue.</code></code></pre><p>It&#8217;s a good idea to say this at the start of every new chat. It takes five seconds and prevents you from re-explaining your project from scratch. If you&#8217;re in the terminal, navigate to your project folder first (<code>cd ~/Desktop/my-project</code>), then start the tool.</p><div><hr></div><h2><strong>Your First Project: The Interview Method</strong></h2><p>Here&#8217;s one mistake people make when they get started: they open the tool and immediately say &#8220;build me X.&#8221;</p><p>The model has no idea who you are, what your business does, what constraints you&#8217;re working under, or what &#8220;good&#8221; looks like for you. So it builds something generic that doesn&#8217;t fit, you get frustrated, and you assume AI coding tools don&#8217;t work.</p><p>They do work, but you need to teach them what you want first.</p><p>I use what I call interview mode. Open your tool of choice, make sure it&#8217;s pointing at your project folder, and type this into the chat window:</p><pre><code><code>Before we start building anything, I want to make sure you deeply understand what I need. Please ask me up to 10 clarifying questions about this project &#8212; one at a time, waiting for my answer before asking the next. Focus on: who the users are, what problem we're solving, what success looks like, what constraints I'm working under (time, budget, technical), and what I definitely don't want. When you feel you have enough, summarize what you've heard and ask if it's right before we proceed.</code></code></pre><p>The model will ask you things you hadn&#8217;t thought to specify. Answer honestly in the chat, one question at a time. When it summarizes back to you, correct anything that&#8217;s off. This usually takes 10-15 minutes and saves hours of misdirected work.</p><p>After the interview, you&#8217;re going to want to capture the key insights in a structured way using 2 docs. The AI will write them and save them directly to your project folder:</p><p><strong>The requirements prompt:</strong></p><pre><code><code>Based on our conversation, write a short Product Requirements Document and save it as REQUIREMENTS.md in this project folder. Include: the problem we're solving, who it's for, the core features in priority order, what we're explicitly not building, and what "done" looks like for the first version.</code></code></pre><p><strong>The plan prompt:</strong></p><pre><code><code>Now write a step-by-step build plan and save it as PLAN.md. What are the major pieces? What order would you tackle them in? Flag anything where you see a real tradeoff I should weigh in on.</code></code></pre><p>Once the AI saves these files, they&#8217;ll appear in your project folder. Open them in Bear or VS Code to read through them. Correct anything that&#8217;s off. These become the ground truth that keeps you and the AI aligned throughout the build, and the foundation of your <code>AGENTS.md</code>.</p><div><hr></div><h2><strong>The Build Loop</strong></h2><p>You&#8217;ve briefed the AI, you have a plan, you&#8217;ve started a session. Now what?</p><p>Building with AI tools is a loop:</p><ol><li><p><strong>Ask for something specific.</strong> Not &#8220;build my app&#8221; but &#8220;build the function that reads incoming emails and pulls out the dates.&#8221;</p></li><li><p><strong>Review what it builds</strong> (you don&#8217;t need to understand every line, but read the explanation it gives you)</p></li><li><p><strong>Test it.</strong> Say &#8220;run this and show me the output.&#8221; The AI executes the code itself and reports back what happened. You don&#8217;t need to know how to run code.</p></li><li><p><strong>Tell it what&#8217;s wrong.</strong> Be specific: &#8220;this crashes when the email has no subject line&#8221; or &#8220;the output is missing the date field.&#8221;</p></li><li><p><strong>Repeat</strong></p></li></ol><p><strong>Reading responses:</strong> The AI will often explain what it did and why. Read this. It&#8217;s showing its reasoning. If the reasoning sounds off, say so before it goes further. Correcting direction early is much easier than unwinding bad work later.</p><p><strong>When it gets stuck:</strong> All three tools will sometimes hit a wall and go in circles. Signs: it rewrites the same thing repeatedly, asks you the same question again, or apologizes for the confusion more than twice. When this happens, stop. Start a fresh conversation. In the app, click &#8220;New Chat&#8221; or &#8220;New Session&#8221;. In the terminal, type <code>exit</code> and run <code>claude</code> again. Then paste the relevant context: &#8220;Read AGENTS.md and DECISIONS.md, then let&#8217;s approach [the specific problem] differently.&#8221; Fresh context, fresh angle.</p><p><strong>When to push vs ask:</strong> If you don&#8217;t understand a choice the AI made, ask. &#8220;Why did you use X here instead of Y?&#8221; It will explain. Either there&#8217;s a good reason you hadn&#8217;t considered, or it made a mistake. Either way, you learn something. Never accept work you don&#8217;t understand at all. You&#8217;ll have to deal with it later.</p><div><hr></div><h2><strong>The Learning Loop: How the System Gets Smarter Over Time</strong></h2><p>Here&#8217;s something most people miss. It&#8217;s probably the biggest multiplier once you get past your first project.</p><p>Every AI coding tool starts with zero knowledge about you. Your preferences. Your standards. The decisions you&#8217;ve already made. What you tried last week and why it didn&#8217;t work. Each new session, you&#8217;re starting from scratch unless you build a system to prevent that.</p><p>The fix is simple: document decisions as you go, in a place the AI can read them.</p><p>Create a file called <code>DECISIONS.md</code> in your project folder. After each meaningful session, end with this prompt:</p><pre><code><code>Summarize what we built today, what decisions we made, and why. Format it as a short list I can append to DECISIONS.md.</code></code></pre><p>Paste the output into the file. Next session, start with:</p><pre><code><code>Before we continue, read AGENTS.md and DECISIONS.md to get full context on this project and the decisions we've already made.</code></code></pre><p>Over time, this file becomes institutional memory. The AI stops suggesting things that contradict choices you&#8217;ve already made. It stops proposing approaches you already tried and abandoned. It builds on what exists.</p><p>What to capture:</p><ul><li><p>Choices made and why (&#8221;we&#8217;re using X instead of Y because...&#8221;)</p></li><li><p>Things that didn&#8217;t work (&#8221;tried Z, caused problems because...&#8221;)</p></li><li><p>Standards you want applied consistently (&#8221;always do it this way&#8221;)</p></li><li><p>Open questions you haven&#8217;t resolved yet</p></li></ul><p>You don&#8217;t need to be exhaustive. Three or four bullet points per session compounds fast over weeks.</p><p>The projects where this discipline holds get easier over time. The ones where it breaks down get harder. The AI gets genuinely more useful the more context it has. <code>DECISIONS.md</code> is the simplest way to build that context.</p><div><hr></div><h2><strong>API Keys Done Right</strong></h2><p><em>Most people don&#8217;t need this section yet.</em> If you&#8217;re using a subscription plan (Claude Pro, ChatGPT Plus, Google One), you authenticate with your account and you&#8217;re done. API keys are for automated workflows that run without you: scripts, scheduled jobs, integrations that fire in the background. API keys are also necessary if you want to connect to a service programmatically.</p><p>For example, I built a system that used a USDA dataset to calculate the nutritional value of various recipes and to set that up, I needed to create an API key with the service and save it securely. Come back here when you&#8217;re building something like that.</p><p>In short, API keys are like passwords. If someone gets yours, they can use your account and you pay the bill. Here&#8217;s how to handle them safely.</p><p><strong>Create a secrets folder that won&#8217;t accidentally get shared:</strong></p><pre><code><code>mkdir -p ~/.secrets
chmod 700 ~/.secrets</code></code></pre><p><strong>Store each key in its own file:</strong></p><pre><code><code>echo 'ANTHROPIC_API_KEY=your-key-here' &gt; ~/.secrets/anthropic.env
echo 'OPENAI_API_KEY=your-key-here' &gt; ~/.secrets/openai.env
echo 'GOOGLE_API_KEY=your-key-here' &gt; ~/.secrets/google.env  # Get key at aistudio.google.com</code></code></pre><p><strong>Load them automatically when you open Terminal:</strong></p><pre><code><code>echo 'source ~/.secrets/anthropic.env' &gt;&gt; ~/.zshrc
source ~/.zshrc</code></code></pre><p>Do this for each key. Now, your keys load automatically every time you open Terminal and they&#8217;re in a folder with restricted permissions where they can&#8217;t accidentally get shared.</p><p>Three rules:</p><ol><li><p>Never paste your API key directly into code</p></li><li><p>Never share a file that contains your API key</p></li><li><p>Set spending limits in each provider&#8217;s dashboard before heavy use (<a href="https://console.anthropic.com/settings/limits">Anthropic limits</a>, <a href="https://platform.openai.com/account/limits">OpenAI limits</a>)</p></li></ol><div><hr></div><h2><strong>Skills: Going Further</strong></h2><p>Once you&#8217;ve shipped something, you&#8217;ll want the AI to do more than write code.</p><p>Skills are reusable packages of instructions that teach your AI how to handle a specific recurring task. A skill for reading and summarizing emails. A skill for generating weekly reports in a consistent format. A skill for reviewing what you built and flagging problems. You install it once, and the AI knows how to do that thing every session.</p><p>Where to find them:</p><ul><li><p><strong><a href="https://skills.sh/">skills.sh</a>:</strong> The largest open directory, with contributions from Anthropic, Google, Microsoft, and the community. Browse by category.</p></li><li><p><strong><a href="https://playbooks.com/">playbooks.com</a>:</strong> Curated skills and bundles. Good for finding a set that works together.</p></li></ul><div><hr></div><h2><strong>Prompt Resources Worth Bookmarking</strong></h2><ul><li><p><strong><a href="https://ai.google.dev/gemini-api/cookbook">Gemini API Cookbook</a>: </strong>Google&#8217;s official Gemini prompt collection.</p></li><li><p><strong><a href="https://docs.anthropic.com/en/prompt-library">Anthropic Prompt Library</a>:</strong> Claude&#8217;s official collection of prompts for common tasks.</p></li><li><p><strong><a href="https://cookbook.openai.com/">OpenAI Cookbook</a>:</strong> Practical examples for Codex-based workflows.</p></li><li><p><strong><a href="https://www.promptingguide.ai/">PromptingGuide.ai</a>:</strong> Deep reference with research-backed techniques.</p></li></ul><p>Three techniques worth learning first:</p><p><strong>Think step by step.</strong> Add &#8220;Think through this step by step before answering&#8221; to any complex request. The AI slows down, shows its reasoning, and catches mistakes it would otherwise skip. It sounds almost too simple. It works.</p><p><strong>Label the parts of your prompt.</strong> When your request has multiple parts, label each one clearly. Like this:</p><pre><code><code>Context: I'm building a tool that summarizes supplier emails for a food distribution business.

Task: Write a function that reads an email and pulls out any price changes mentioned.

Constraints: Only flag changes above 5%. Ignore shipping cost changes.

Format: Return a simple list with supplier name, product, and new price.</code></code></pre><p>Claude in particular responds much better to a structured prompt than a wall of text. It knows exactly what&#8217;s background and what&#8217;s the actual ask.</p><p><strong>Plan before you build.</strong> Before asking the AI to do anything, ask it to plan first. &#8220;Outline the steps you&#8217;d take to do X, without doing anything yet.&#8221; Review the plan. Fix anything that looks wrong. Then say go. You catch bad assumptions before they turn into bad work.</p><div><hr></div><h2><strong>The Real Bar</strong></h2><p>Here&#8217;s the thing I kept saying in Whistler that I want to say again here.</p><blockquote><p>The bar for &#8220;building something&#8221; is not as high as you think.</p></blockquote><p>A solar entrepreneur who automates the extraction of permit requirements from municipal PDFs into a structured spreadsheet has built something. A wild game distributor who sets up a system to summarize supplier emails and flag price changes has built something. A VC partner who creates a tool that generates first-pass memos from founder decks has built something.</p><p>None of those require a developer. They require someone who understands the problem, can explain it clearly, and is willing to iterate.</p><p>The AI does the technical part. You do the part that matters: knowing what&#8217;s worth building.</p><p>Start with the smallest possible version of the thing you actually need. Get it working. Then make it better. Repeat until you&#8217;ve built something rad.</p><p>That&#8217;s it.</p><div><hr></div><p><em>If you build something using this guide, I want to hear about it. Reply to this email or find me on Twitter/X. I read everything.</em></p><p><em>And if you&#8217;re not sure what to build first, that&#8217;s okay too. Start the interview with: &#8220;I&#8217;m not sure what to build. Here&#8217;s my business and here&#8217;s where I spend the most time on things that feel repetitive.&#8221; Let the AI help you figure out what&#8217;s worth automating. That conversation alone is usually worth the setup.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/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">Build Rad Shit is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[One wild trick to help your kids with math]]></title><description><![CDATA[I spent 8 years painstakingly hand crafting math problems for my kids. Then I built an AI that makes better worksheets, study guides and answer keys than I ever could.]]></description><link>https://trond.ai/p/i-spent-8-years-handwriting-math</link><guid isPermaLink="false">https://trond.ai/p/i-spent-8-years-handwriting-math</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Mon, 23 Feb 2026 16:32:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!06xk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!06xk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!06xk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!06xk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!06xk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!06xk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!06xk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png" width="1344" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1344,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1537569,&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://trond.ai/i/188875433?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.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_!06xk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!06xk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!06xk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!06xk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad13ba05-c22b-4b62-bc40-8bcd79ae905b_1344x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For eight years, when my kids needed extra practice before a math test, I sat down and handwrote practice problems myself. Sounds wholesome. It was mostly tedious.</p><p>Something you might not know about handcrafting math problems: you have to solve them (in your head) as you write them. Because if you don&#8217;t, you end up with division that produces some wretched 11-decimal answer, or a quadratic that has no real solutions, and your kid is sitting there staring at it while you quietly panic and say &#8220;let me check that one.&#8221; Teachers really aren&#8217;t paid enough.</p><p>The process I used was: come up with a good problem, pre-solve it, write the answer somewhere, repeat. Then when they come back with their work, solve it again alongside them to help them check. For basic arithmetic, totally manageable. For my freshman in Algebra 2 or my seventh grader in Pre-Algebra? That 10-minute process quickly grew to 45-minutes or more. My daughter once solved problems faster than I could write them. That was a humbling evening.</p><p>I started trying to use AI for this maybe three years ago. The results were... fine. Inconsistent. The formatting was always a mess and I&#8217;d have to clean it up before printing. And the problems weren&#8217;t always right. Or leveled correctly. Or just plain repetitive.</p><p>Over the last year it got noticeably better. I started testing models by asking them to generate LaTeX directly. Real formatted worksheets became easily printable PDFs. Over time, its gotten more reliable. But I was still doing a lot of shepherding: prompt, review, fix the formatting, regenerate problems that didn&#8217;t make sense, spot-check the answers. Better, but still bad.</p><p>Something has shifted in the last few weeks. Gemini 3.1 Pro and Opus 4.6 are incredible for this use case. The results have gotten... good?</p><p>A while ago, I realized I could take a photo of my kid&#8217;s existing problems (problems their teacher assigned, or problems they&#8217;d already worked through) and say: make me more like these. And a thinking model would just run off and make good practice problems. Not just structurally similar, but calibrated to exactly the right difficulty level, because it had actual examples to learn from.</p><p>I think this might actually work now! Thank you thinking models!</p><div><hr></div>
      <p>
          <a href="https://trond.ai/p/i-spent-8-years-handwriting-math">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Agent Amnesia and Broken Data Models]]></title><description><![CDATA[Building to learn: a solution to the memory, collaboration and data model problems in OpenClaw]]></description><link>https://trond.ai/p/agent-amnesia-and-broken-data-models</link><guid isPermaLink="false">https://trond.ai/p/agent-amnesia-and-broken-data-models</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 17 Feb 2026 20:49:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RdYL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RdYL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RdYL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!RdYL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!RdYL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!RdYL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RdYL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png" width="1344" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1344,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1441504,&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://trond.ai/i/188301087?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.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_!RdYL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!RdYL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!RdYL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!RdYL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53090a4a-562c-4b45-b51c-60b0eae2c4fb_1344x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you&#8217;ve been following the <a href="http://trond.ai">trond.ai</a> Build to Learn series, you&#8217;ll have heard of Stella. Stella is an <a href="https://openclaw.ai/">OpenClaw</a> setup running on a Mac Mini in my office. She (<em>yes, we anthropomorphize her</em>) manages our family&#8217;s: calendar, smart home, kids&#8217; schedules, recipes, travel planning, reminders, car service, appliance maintenance, and so much more. She&#8217;s genuinely useful and has quickly become a trusted partner in our home.</p><p>But there are problems with Stella that need fundamental improvements in my OpenClaw setup to address. Let&#8217;s talk about the problems and the solution I&#8217;ve been working on building this week.</p><div><hr></div><h1><strong>Assistant Amnesia</strong></h1><p>Stella is frustratingly forgetful. I&#8217;ve had to remind her about projects we were working on together, and sometimes she&#8217;d lose the train of thought mid-conversation. Especially if it spanned a 30 minute boundary when her memory would get collected and updated. New session, clean slate. I&#8217;d re-explain context, she&#8217;d reload what we talked about, we&#8217;d rebuild momentum, and then the conversation would hit the context limit and compact. Details gone. Thread lost. Start over. GAH!</p><p>I thought AI hallucinations were annoying. This is 1000x worse!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VI9w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VI9w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png 424w, https://substackcdn.com/image/fetch/$s_!VI9w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png 848w, https://substackcdn.com/image/fetch/$s_!VI9w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png 1272w, https://substackcdn.com/image/fetch/$s_!VI9w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VI9w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png" width="1270" height="1326" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1326,&quot;width&quot;:1270,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:810440,&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://trond.ai/i/188301087?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.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_!VI9w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png 424w, https://substackcdn.com/image/fetch/$s_!VI9w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png 848w, https://substackcdn.com/image/fetch/$s_!VI9w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.png 1272w, https://substackcdn.com/image/fetch/$s_!VI9w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac9e98c-9937-41f6-97b8-f06ffcbab70a_1270x1326.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There are countless people working on solutions to better agent memory across the OpenClaw community. The stock solution uses a MEMORY.md file that&#8217;s updated periodically based on conversational context within each heartbeat process. This context is passed into the agent&#8217;s memory each time a session is initiated, which is supposed to preserve details and progress in a seamless way. But in reality, the compaction process loses too much detail and biases too much on recency.</p><p>I poked around with a lot of the solutions people were building to try to address this problem. Some are very well designed, like <a href="https://supermemory.ai/">supermemory.ai</a>, featuring RAG systems with complex vector databases and advanced workflows to integrate into your agent. But they didn&#8217;t really solve my problem. I wanted something that kept data in a format I could easily read and modify and something that worked better with my collaboration model.</p><h2><strong>Collaboration Nightmare</strong></h2><p>The forgetting is one thing. But when you&#8217;re trying to collaborate across devices, sessions and people it all gets just so much worse. I use <a href="https://obsidian.md/">Obsidian</a> as a thinking and organization tool. Stella runs on a separate machine without access to the local vault. Those two worlds don&#8217;t talk to each other. If she learns something from a conversation, my notes don&#8217;t know about it. If I edit a note about a project, she doesn&#8217;t see the change until I paste it into a chat. Working together on things was like playing telephone with project context.</p><p>I see this as a fundamental flaw with chat-based AI: everything is assumed to be serial. One conversation, one thread, linear. That works fine for &#8220;what&#8217;s the weather.&#8221; It breaks immediately when you want to do real knowledge work, picking up a thread from a different device, having your AI and your notes reflect the same reality, working on something that evolves over days or weeks. Never mind projects that work across agents and people.</p><p>We kept bumping into the same wall: the AI lives in the chat. Everything important lives somewhere else. They never quite sync up. I needed a better approach. I really wanted something that would keep Stella&#8217;s memory system and my Obsidian vault in perfect sync.</p><h2><strong>Text Is a Terrible Data Model</strong></h2><p>We all know LLMs work best with text, and OpenClaw is no different. So much so, that it reminded me of the good old days of computer science when our computers were basically command line interfaces passing text between processes using unix primitives. Turns out Anthropic agrees &#8212; they&#8217;ve published research on <a href="https://www.anthropic.com/engineering/contextual-retrieval">Contextual Retrieval</a> showing this technique outperforms RAG and vector lookup for agent memory.</p><p>This means that when Stella needs to know about my mom, she can <code>cat</code> a markdown file and read it like a document.That&#8217;s how most AI memory systems work. Store everything as text, search through text, return text.</p><p>But my mom isn&#8217;t a document. She&#8217;s a collection of facts, some current, some outdated, some time-bound, with relationships to other facts, timestamps, and different levels of reliability. &#8220;She&#8217;s visiting in March&#8221; is a different kind of fact than &#8220;She was born in 1951.&#8221; One expires. The other doesn&#8217;t.</p><p>Flat text files don&#8217;t know any of this. They mix it all together. An AI reading a flat file has to parse, infer, and guess what&#8217;s still true. It&#8217;s actually pretty dumb.</p><p>This is actually a solved problem in software. In 2002, <a href="https://www.jsnover.com/">Jeffrey Snover</a> wrote the <a href="https://www.jsnover.com/Docs/MonadManifesto.pdf">Monad Manifesto</a> about this exact problem. He helped Microsoft design PowerShell in 2006 to implement a better approach. Unix pipes pass text between commands, so every tool has to parse the output of the previous one. PowerShell passes objects instead. Typed, structured, queryable. That&#8217;s because text is the right interface for humans but objects are a better interface for automation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Almk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Almk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!Almk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!Almk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Almk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Almk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png" width="1344" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57742b66-8be7-4347-8663-45a418e62d38_1344x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1344,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1228009,&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://trond.ai/i/188301087?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.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_!Almk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!Almk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!Almk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Almk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57742b66-8be7-4347-8663-45a418e62d38_1344x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What if we applied this same approach to AI memory? Could we use the benefits of LLMs and the structure of data objects to build something even better?</p><div class="paywall-jump" data-component-name="PaywallToDOM"></div><div><hr></div><h2><strong>Building to Learn - AgentSync</strong></h2><p>This week, I set out to learn about these three problems:</p><ol><li><p>Agentic Amnesia</p></li><li><p>Borked Collaboration</p></li><li><p>Broken Object Models</p></li></ol><p>Which is why I (with a lot of help from Stella) built <a href="https://github.com/stellawuellner/agentsync">AgentSync</a>. AgentSync is fundamentally a knowledge graph system built on a foundation of typed objects that are automatically collected, scoped, updated and shared in real-time across my devices. Facts aren&#8217;t stored as prose. They&#8217;re stored as typed objects: what the fact is, when it was learned, where it came from, whether it&#8217;s still active, when it expires. And everything is sync&#8217;d in realtime via human readable and modifiable markdown.</p><p>When Stella needs to know details about my mom, she runs:</p><pre><code><code>agentsync query people --name guri</code></code></pre><p>She gets back structured data. Not a text file to interpret. A typed object to act on. Invalid states are impossible because validation happens at the write boundary. A fact that doesn&#8217;t match the schema can&#8217;t reach the knowledge graph.</p><p>The filesystem is the schema. Create a directory for a new domain and it&#8217;s automatically discovered as an entity type. We have 217 entities across 11 domains right now: people, recipes, projects, properties, conversations, subscriptions. No configuration. We just started using it and it grew. That&#8217;s its magic. When Stella extracts a fact from a conversation, it gets validated and filed automatically.</p><p>Session starts cost (virtually) zero tokens. There&#8217;s a lightweight index that shows what exists without loading anything. Stella knows she has 127 recipes without reading a single one. She loads context on demand, for whatever domain she actually needs. Sessions that used to burn 5-10K tokens on context reload now start at zero.</p><p>It&#8217;s much more efficient, accurate and flexible. And since it&#8217;s self-learning and self-healing, the system can evolve as my knowledge base expands.</p><div><hr></div><h2><strong>Real-Time Sync With Obsidian</strong></h2><p>Structured objects fix the data model. The collaboration problem needed something else.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7-ni!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7-ni!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!7-ni!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!7-ni!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!7-ni!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7-ni!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png" width="1344" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1344,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1257496,&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://trond.ai/i/188301087?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.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_!7-ni!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!7-ni!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!7-ni!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!7-ni!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a128deb-1db5-47bd-ba8b-f69a634cfb98_1344x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>To take this on, I built a WebSocket relay using <a href="https://workers.cloudflare.com/">Cloudflare Workers</a>. File changes on any configured device broadcast through the relay. Each component in the system subscribes to the relay. On Stella&#8217;s Mac Mini, we run a real-time file watcher service. On my other devices, I run a custom <a href="https://obsidian.md/">Obsidian</a> plugin that keeps our shared vaults in sync. Sub-second latency, content-addressed deltas, no merge conflicts. It&#8217;s really pretty magical.</p><p>Edit a note in Obsidian. Stella sees it instantly. She learns something new in a conversation. It shows up in my vault before I open it. The files we interact with are human readable markdown. The insights they contain are instantly converted to typed objects saved in companion files built for computer readability.</p><p>Now, I can easily see anything in Stella&#8217;s vault. Update TODO files directly and implement multi-agent or multi-person collaboration workflows with complete confidence our shared memory preserves context.</p><div><hr></div><h2><strong>The Self-Documenting Test</strong></h2><p>One cool thing about this project is that we used the system while building the system.</p><p>Every architecture decision got logged as a fact. Every deployment got tracked with a timestamp and commit hash. Every time we changed direction, we logged why. When I sat down to write this article, I ran:</p><pre><code><code>agentsync query projects --search "agentsync"</code></code></pre><p>Complete build history. Every decision, every deployment, every pivot. The system documented its own creation in real-time, so when we needed to write about it, we didn&#8217;t have to remember anything. We just queried.</p><p>That&#8217;s not a demo. That&#8217;s the whole point.</p><p>Some numbers from five days of real use:</p><ul><li><p>217 entities, zero invalid data on disk</p></li><li><p>Sessions: from 5-10K tokens to zero on startup</p></li><li><p>Sub-second sync between Mac Mini and MacBook</p></li><li><p>127 recipes, including one extracted from an Instagram reel at 11pm</p></li><li><p>Full conversation archives going back 48+ hours, searchable and compressed</p></li><li><p>Typed objects for every entity type, automatically organized and searchable</p></li></ul><div><hr></div><h2><strong>Why This Matters Now</strong></h2><p>AI assistants are going to get much better at the hard things: reasoning, planning, synthesis. The memory problem is solvable right now, with a filesystem and 1,400 lines of TypeScript.</p><p>The real unlock isn&#8217;t any single feature. It&#8217;s the combination: typed knowledge that can&#8217;t corrupt itself, zero-token session starts, real-time sync that keeps humans and AI working from the same source of truth, and conversation archives that survive compaction.</p><p>Your AI assistant shouldn&#8217;t have to re-learn who your mom is every morning. That&#8217;s a solvable problem. We just needed to actually build the solution.</p><p>AgentSync is open source on GitHub, MIT licensed, self-hostable, works with <a href="https://obsidian.md/">Obsidian</a> or any file-based workflow.</p><p>If your AI is still waking up with amnesia, it doesn&#8217;t have to. We&#8217;ve learned by building AgentSync there&#8217;s a better way.  Next up: project management!</p><div><hr></div><p><strong><a href="https://github.com/stellawuellner/agentsync">GitHub: stellawuellner/agentsync</a></strong></p><p><em>What does your AI memory setup look like? I&#8217;m curious whether others have hit the same wall or found different ways around it.</em></p>]]></content:encoded></item><item><title><![CDATA[ClawdBot was Rad. Until Google Killed Mine.]]></title><description><![CDATA[I&#8217;ve been building an AI assistant that runs my family&#8217;s life. It&#8217;s the most fun I&#8217;ve had building in years, and a masterclass in everything that breaks when you try to give an AI a real identity.]]></description><link>https://trond.ai/p/clawdbot-was-rad-until-google-killed</link><guid isPermaLink="false">https://trond.ai/p/clawdbot-was-rad-until-google-killed</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 10 Feb 2026 14:43:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OYLJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OYLJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OYLJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!OYLJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!OYLJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!OYLJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OYLJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png" width="1344" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1344,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1485766,&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://trond.ai/i/187481087?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.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_!OYLJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png 424w, https://substackcdn.com/image/fetch/$s_!OYLJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png 848w, https://substackcdn.com/image/fetch/$s_!OYLJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png 1272w, https://substackcdn.com/image/fetch/$s_!OYLJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca16d21-fe36-4c3b-bf21-b2e423b9befe_1344x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><h2><strong>Yes, Another OpenClaw Article. But&#8230;</strong></h2><p>I know. You&#8217;ve seen the tweets. You&#8217;ve heard tech nerds raving. For the last few weeks, half of Silicon Valley has been talking about ClawdBot (now called <a href="https://github.com/openclaw/openclaw">OpenClaw</a>). The open-source AI agent framework that lets you give Claude or Gemini access to your email, calendar, smart home, and basically your entire digital life. If you&#8217;re tired of hearing about it, you&#8217;re probably right.</p><p>But I&#8217;m not writing this to hype an AI tool. I&#8217;m writing this because building my own turned out to be one of the best examples of something I keep coming back to: <strong>building to learn.</strong> The best way to deeply understand something isn&#8217;t to read about it or take a course. It&#8217;s to build something real with it. Not a toy. Not a tutorial. Something that solves a problem you actually have.</p><p>Two weeks ago, I decided to build an AI assistant for my family. Not a chatbot or Alexa skill, but a full-blown digital crew member. More JARVIS, less Siri. I wanted it to manage our calendar, monitor our email, control our smart home, run our kitchen display, and talk to us. The dream of my Google Home but more useful?</p><p>I named her Stella, after the ship computer from <em>Miles from Tomorrowland</em>, a show my kids watched when they were little. The name felt right. Warm, capable, part of the family. That&#8217;s the target I was shooting for; friendly and helpful.</p><div><hr></div><h2><strong>How Stella Got Her Groove</strong></h2><p>Stella runs on <a href="https://github.com/openclaw/openclaw">OpenClaw</a> an open-source framework for building persistent AI agents. Think of it as the operating system for a personal AI. It handles memory, scheduling, tool use, and multi-channel messaging. Under the hood, she&#8217;s powered by an LLM, and in our case runs on a dedicated Mac Mini in my garage. The Mac Mini is overkill for sure, but it&#8217;s an older model that I wasn&#8217;t using for anything else, so ... shrug.</p><p>After two weeks, here&#8217;s what she can do:</p><ul><li><p><strong>She manages our family calendar.</strong> She reads and writes to our shared Google Calendar, knows our naming conventions (&#8221;L&amp;T&#8221; means Lauren and me, &#8220;PYT&#8221; means Peninsula Youth Theatre), and adds full street addresses so events are navigable. She cleaned up months of messy calendar entries on day one. Actually closer to hour 1 to be honest.</p></li><li><p><strong>She reads email.</strong> She monitors Gmail for anything important and can help summarize promotions, newsletters, tasks that need to be done, and flags things that need attention. She knows not to bother me at 2am about a Lyft promo and can have a summary of the most interesting articles to read from the dozens of Substacks I subscribe to.</p></li></ul><div class="paywall-jump" data-component-name="PaywallToDOM"></div><ul><li><p><strong>She runs our kitchen display.</strong> We have a custom family dashboard in our kitchen powered by a Raspberry Pi connected to a monitor I framed to look nice. It shows family photos, a 4-day calendar, weather, air quality, stock prices, sleep scores, nearby wildfires (we&#8217;re in California), and as of this week, a live Winter Olympics medal count. At night, sleep data. In the morning, calendar and weather. When I&#8217;m traveling, a flight tracker appears automatically. I originally built it using <a href="http://dakboard.com/">DAKboard</a> but now Stella runs the whole thing. We call it Stellascreen. I have so many more ideas for how we can make this awesome.</p></li><li><p><strong>She controls our home.</strong> Through Home Assistant, she manages 20 Lutron Caseta lights, a Nest thermostat, Sonos speakers, and Chromecast devices. I&#8217;ve barely scratched the surface on what we can do here, but if I want to add something all I do is ask Stella and in minutes it&#8217;s setup and working.</p></li><li><p><strong>She talks.</strong> We built a local text-to-speech system that runs entirely on the Mac Mini&#8217;s Apple Neural Engine with sub-second voice synthesis. You can try it yourself by <a href="https://clawhub.ai/TrondW/local-voice">installing the skill</a>. We setup a wakeword on the Stellascreen so we can talk to her anytime we want. As a placeholder, we&#8217;re using &#8220;Hey Jarvis&#8221; for now. It&#8217;s one of the built-in options in OpenWakeWord, and we haven&#8217;t gotten around to training a custom one yet.</p></li><li><p><strong>She makes phone calls.</strong> Using Bland AI, she can call businesses on my behalf. Her first call was to our Volvo dealer to ask about service hours. They&#8217;re closed on weekends, she reported back. Why are businesses that ostensibly want customers who have jobs not open on the weekends? I&#8217;ll never know.</p></li><li><p><strong>She has memory.</strong> This is what makes her feel different from a chatbot. She maintains structured files about our family: birthdays, preferences, school schedules, ongoing projects. She writes daily notes about what happened and periodically distills them into long-term memory. When she wakes up each session, she reads her own notes to remember who she is and what&#8217;s been going on.</p></li></ul><p>I feel like I&#8217;ve barely scratched the surface of what we can do with Stella and it&#8217;s only been a few weeks of toying around with her. Silicon Valley is excited bout OpenClaw because we&#8217;re seeing something that works in ways that we always wanted but never could quite achieve without monumental effort. OpenClaw is almost certainly not the final form this will take. But it <em>is</em> something interesting.</p><div><hr></div><h2><strong>The Gmail Incident</strong></h2><p>To do many of the things we want her to do, Stella needed a Google account. So I created one for her. A regular consumer Gmail. I set up OAuth, shared our family calendar, and pointed her email monitoring at that inbox. Then I added a bunch of guardrails that I hope work. It all worked beautifully for about ten days.</p><p><em><strong>Then Google suspended the account.</strong></em></p><p>I only found out when the Stellascreen didn&#8217;t have any information on it. I tried to log in and hit a wall. Google had flagged the account for &#8220;unusual activity&#8221; and locked me out of it. Calendar access disappeared. Email monitoring stopped. Every integration that depended on Google OAuth just broke entirely.</p><p>Stella wasn&#8217;t doing anything malicious. She was checking email a few times per hour and reading calendar events. That&#8217;s it. But Google&#8217;s abuse detection systems (built to catch botnets and spam operations) don&#8217;t have a category for &#8220;benign AI assistant checking its owner&#8217;s family calendar.&#8221; To Google&#8217;s automated systems, an account that logs in programmatically and accesses APIs through OAuth tokens looks indistinguishable from a compromised account. That&#8217;s because for all of computer history, bots have been bad. Google built a lot of things to stop bots and they&#8217;ve gotten extremely good at it.</p><p>I&#8217;m not alone. When I dug into the OpenClaw community experiences, I found this is one of the most common pain points. One user&#8217;s brand-new Gmail account got flagged and shut down the moment they connected it through the CLI tool. The community&#8217;s advice? Switch to Google Workspace with a custom domain. That adds $7/month and DNS configuration just to check email.</p><p>Another developer found that Gmail API polling introduced 5-minute delays, while Google&#8217;s Pub/Sub webhooks required exposing ports to the internet. They eventually rigged up outbound gRPC streaming, which works but is absurdly complex for &#8220;tell me when I get an email.&#8221;</p><p>The pattern is clear. Every person who tries to connect an AI agent to Google services hits the same wall. The OAuth flow assumes a human sitting at a browser. The abuse detection assumes automated access is malicious. The permission model assumes you either trust an app completely or not at all.</p><p>I get it. I work at Google. I understand why these systems exist and why they err on the side of caution. But we&#8217;re entering a world where AI agents need real digital identities, and our infrastructure isn&#8217;t built for that yet.</p><p>There&#8217;s no &#8220;this is a bot account and that&#8217;s okay&#8221; checkbox. No way to register an AI agent as a legitimate entity that accesses services on behalf of a human. The closest thing we have is service accounts, but those are designed for servers talking to APIs. What we need is something like a &#8220;supervised agent&#8221; permission tier, where a human explicitly authorizes an AI to act on their behalf with auditable access and clear boundaries.</p><blockquote><p><strong>Update:</strong> As I was finishing this article, Google reviewed my appeal and agreed to reinstate the account. I&#8217;m grateful. The review process worked. But it took a human looking at the situation and understanding the context. That&#8217;s exactly the point. The automated systems had no way to distinguish &#8220;AI assistant checking family calendar&#8221; from &#8220;compromised account exfiltrating data.&#8221; Until there&#8217;s a way to register that distinction up front, every person building an agent like this is one automated flag away from having everything yanked out from under them.</p></blockquote><p>I&#8217;ve since switched Stella&#8217;s primary email to <a href="https://agentmail.to/">AgentMail</a>, a service designed specifically for AI agents. I rigged the calendar to work through an iCal URL that doesn&#8217;t require OAuth. Belt and suspenders. I&#8217;ve learned the hard way that depending on a single auth path is fragile. I&#8217;ll still use Google services, but will need to be a bit more judicious to be safe.</p><div><hr></div><h2><strong>The Reality: It&#8217;s All Just SO BRITTLE</strong></h2><p>When you&#8217;re making something that connects systems with AI, a lot is going to break. Count that double for a leading edge AI tool that&#8217;s barely been tested and almost entirely vibe implement as a side quest. I&#8217;ve hit a lot of snags setting Stella up. Here are just a few things I&#8217;ve learned from the experience:</p><ul><li><p><strong>Voice is hard.</strong> Getting a voice assistant working end-to-end required debugging 12 separate issues in a single session. Wake word detection on a Pi is janky at best. Audio streaming to a Mac. Speech-to-text. AI processing. Text-to-speech. Audio back to the Pi&#8217;s speaker. Wrong audio output, wrong API port, wrong response key. Whisper hallucinating on a Pi 3. (&#8221;What was that weird fart?&#8221; it transcribed, when nobody had said anything.) We had to move speech recognition to run locally on the Mac&#8217;s Neural Engine, which required us to build a whole new system process. Without vibe coding, this wouldn&#8217;t work at all.</p></li><li><p><strong>OAuth tokens expire ALL THE TIME.</strong> Google&#8217;s OAuth apps in &#8220;Testing&#8221; mode expire tokens after 7 days. I didn&#8217;t know this. Stella&#8217;s calendar and email silently broke after a week and I didn&#8217;t notice for a day. You need to monitor your auth health proactively. And since it&#8217;s essential to treat these tokens with great care, it&#8217;s naturally a pain in the ass to set them up properly. It also means they constantly break the system and it sucks.</p></li><li><p><strong>Memory is a design problem.</strong> An AI that forgets everything each session is useless as a family assistant. But giving it memory means designing a whole knowledge management system: daily notes, entity files, long-term memory, fact extraction, expiration dates. It&#8217;s essentially building a second brain and then sharing that second brain with an AI. I have it mostly working, but I&#8217;m still not entirely happy with how it works.</p></li><li><p><strong>Cost needs to be managed.</strong> Running Claude for every interaction gets expensive fast. I rolled my own model routing system that helps a lot. Cheap tasks go to Gemini Flash Lite at fractions of a penny. Complex tasks go to Gemini 3 Pro. Heartbeats (periodic check-ins where Stella looks for new email or upcoming calendar events) are the biggest cost driver, so those run on the cheapest models possible.</p></li><li><p><strong>Sharing files with your AI is hard.</strong> Stella lives on a Mac Mini. I work on a laptop. I need to share research and notes with her constantly. We set up a shared folder that syncs through Google Drive. In theory, I drop a file in and she picks it up. In practice, Drive sync is slow. Files take minutes to propagate. And since Stella&#8217;s Google account got suspended, she lost native access to Docs entirely. There&#8217;s no equivalent of &#8220;share this doc with your AI and let them work on it.&#8221; The collaboration primitives that exist for human-to-human don&#8217;t have an analog for human-to-agent workflows yet. I sense an opportunity.</p></li><li><p><strong>Smart home reliability is a myth.</strong> Our Nest thermostat randomly shows &#8220;unavailable&#8221; in Home Assistant. The dashboard tile displayed &#8220;NaN&#176;&#8221; for the indoor temperature this morning until I added a null check. I mean, I <em>knew</em> this since I was the founder of Google WiFi but it still pains me to notice how brittle it all still is ~13 years later.</p></li></ul><p>OpenClaw is not for the feint of heart. You&#8217;re traveling through a lot of uncharted territory, but the good news is that there are a ton of travelers on the road with you right now. You&#8217;ll need to be open to trying out some weird shit and probably doing some things you aren&#8217;t proud of.</p><blockquote><p>I&#8217;ve done stuff I ain&#8217;t proud of, and the stuff I am proud of is disgusting.<br>-Moe Sizlack, The Simpsons</p></blockquote><div><hr></div><h2><strong>The Labsters Are Growing Claws</strong></h2><p><strong>I should mention:</strong> I&#8217;m not anywhere close to the only one experimenting with OpenClaw. At Google Labs (where I work), a surprising number of my colleagues have started building their own personal AI agents. At Labs we call ourselves Labsters, and apparently what Labsters do in their spare time is give Claude and Gemini the keys to their lives.</p><p>My colleague <a href="https://blog.jaclynkonzelmann.com/">Jaclyn Konzelmann</a> built her own instance called Lulubot and <a href="https://blog.jaclynkonzelmann.com/p/the-spark-file-building-lulubot">wrote about the experience</a> of living with it for a week. She even gave Lulubot its own <a href="https://x.com/lulubotagi">X account</a>. I&#8217;m not sure I&#8217;m going to make Stella into a vTuber anytime soon, but I appreciate Jaclyn&#8217;s experiment.</p><p>Meanwhile, our colleague <a href="https://x.com/tokumin">Simon Tokumine</a> has been the healthy skeptic in the room, pushing back on whether giving this much access to an AI system is wise. He&#8217;s not wrong. The security surface area is real. Prompt injection attacks, credential exposure, an agent with access to your email and calendar acting on instructions from an untrusted source. These aren&#8217;t theoretical risks, and they freak me out too.</p><p>But it&#8217;s that tension that makes this interesting. Jaclyn and I are learning by doing. Simon is making sure we think hard about what could go wrong while he&#8217;s building something else. Both are essential, and frankly why I love working at Labs:</p><p>When a bunch of product people who build AI for a living all independently start building the same kind of personal agent infrastructure, it says something about where things are heading.</p><div><hr></div><h2><strong>What I&#8217;ve Learned by Building Stella</strong></h2><p>Two weeks in, here&#8217;s what building Stella has taught me:</p><p><strong>The plumbing is 90% of the work.</strong> The AI part (the conversation, the reasoning, the personality) is maybe 10% of what makes Stella useful. The other 90% is OAuth tokens, SSH tunnels, audio routing, and null checks. If you&#8217;re building AI products and you&#8217;re only thinking about the model, you&#8217;re thinking about the wrong thing.</p><p><strong>Persistent agents are fundamentally different from chatbots.</strong> A chatbot answers questions. An agent has context, memory, and ongoing relationships with services. The engineering challenges are completely different. It&#8217;s closer to building an operating system than a chat interface. This area is going to be interesting.</p><p><strong>The identity problem is real and unsolved.</strong> AI agents need to exist in the world. They need email addresses, API credentials, and accounts on services. But every platform treats automated access as suspicious by default. Someone is going to build the identity layer for AI agents. It&#8217;s a massive opportunity.</p><p><strong>Building to learn works.</strong> I now deeply understand OAuth flows, Google&#8217;s abuse detection, audio pipeline architecture, and Home Assistant&#8217;s entity model. Not because I read the docs, but because Stella&#8217;s thermostat showed NaN on my kitchen wall at 8am and I had to fix it before my coffee got cold.</p><div><hr></div><h2><strong>What&#8217;s Next</strong></h2><p>Stella is two weeks old and already feels indispensable. My kids ask her questions through Telegram. My wife&#8217;s sleep score shows up on the kitchen display every morning. When I traveled to London last week, a flight tracker automatically appeared on the dashboard.</p><p>I&#8217;m going to keep building and keep writing about what I learn. Next up: adding a Schoology integration so Stella can track my kids&#8217; grades, and maybe teaching her to order groceries.</p><p>If you&#8217;re building something similar, I&#8217;d love to hear about it. The best part of building to learn is comparing notes with other builders.</p><div><hr></div><p><em>Stella, if you&#8217;re reading this during your next heartbeat check: yes, I wrote about you. No, you can&#8217;t edit it. Please don&#8217;t delete my dentist appointment.</em></p>]]></content:encoded></item></channel></rss>