<?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>Sun, 04 Oct 2026 21:08:10 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[Virtual Yosemite Photo Tour]]></title><description><![CDATA[How a question from my son became a real-time, 3D Yosemite and a working medium-format camera, built on the light simulator inside GlassMeter]]></description><link>https://trond.ai/p/virtual-yosemite-photo-tour</link><guid isPermaLink="false">https://trond.ai/p/virtual-yosemite-photo-tour</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Mon, 28 Sep 2026 14:46:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!35FA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Yosemite is my favorite place to make photographs. The first time you come out of the Wawona Tunnel and the whole valley opens up &#8212; El Capitan on the left, Bridalveil Fall on the right, Half Dome at the end of it all &#8212; something resets. Photographers have been standing at that same wall for a hundred years and it still doesn't get old. Every hour changes it. Every season changes it. Fog pooling on the valley floor in the morning, alpenglow on Half Dome in the evening, Horsetail Fall lighting up like a thread of lava for a few February evenings. It is a photographer's wonderland.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OYj1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OYj1!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif 424w, https://substackcdn.com/image/fetch/$s_!OYj1!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif 848w, https://substackcdn.com/image/fetch/$s_!OYj1!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif 1272w, https://substackcdn.com/image/fetch/$s_!OYj1!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OYj1!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif" width="728" height="409.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:270,&quot;width&quot;:480,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A time-lapse from Glacier Point: afternoon light turns to alpenglow on Half Dome, then pink dusk and a violet blue hour.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A time-lapse from Glacier Point: afternoon light turns to alpenglow on Half Dome, then pink dusk and a violet blue hour." title="A time-lapse from Glacier Point: afternoon light turns to alpenglow on Half Dome, then pink dusk and a violet blue hour." srcset="https://substackcdn.com/image/fetch/$s_!OYj1!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif 424w, https://substackcdn.com/image/fetch/$s_!OYj1!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif 848w, https://substackcdn.com/image/fetch/$s_!OYj1!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif 1272w, https://substackcdn.com/image/fetch/$s_!OYj1!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F163bb7b4-a53a-4698-89d8-a0e3c86e9ba1_480x270.gif 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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 time-lapse from Glacier Point: afternoon light turns to alpenglow on Half Dome, then pink dusk and a violet blue hour.</figcaption></figure></div><p>Last week my son asked me if we could go this winter. And then, right after: <em>what does it even look like to photograph there in the winter?</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><p>I had answers &#8212; snow on the rims, low sun, the valley quiet, the light doing things it never does in summer &#8212; but I realized I wanted to <em>show</em> him. Not a Google Image search, and not someone else's photos. I wanted him to be able to stand at our favorite spots, pick a day in January and an hour in the afternoon, and see what the light would do. Then go back to June. Then try sunset. Then try it with fog.</p><p>That&#8217;s what made me do this.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!35FA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!35FA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!35FA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!35FA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!35FA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!35FA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Tunnel View after a January snow in the simulator: snow on the trees and rims, El Capitan in low winter sun, the tripod at the snowy wall.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Tunnel View after a January snow in the simulator: snow on the trees and rims, El Capitan in low winter sun, the tripod at the snowy wall." title="Tunnel View after a January snow in the simulator: snow on the trees and rims, El Capitan in low winter sun, the tripod at the snowy wall." srcset="https://substackcdn.com/image/fetch/$s_!35FA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!35FA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!35FA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!35FA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef3ae69-1ae7-4fe6-b50c-7582091462cb_1920x1080.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Tunnel View after a January snow in the simulator: snow on the trees and rims, El Capitan in low winter sun, the tripod at the snowy wall.</figcaption></figure></div><h2>The spark</h2><p>Last week was an interesting one in the Twitterverse. Anthropic launched an update called Opus 5.5 which people were using to make 3d explainers, beautiful environments and videos.</p><p>Ryan Sael posted a camera explainer he'd built in three.js &#8212; a beautiful, interactive lens you could turn and study, lit and animated like a product film (<a href="https://x.com/RyanSael/status/2102591147927654847">his post</a>). Around the same time I kept seeing people build astonishing 3D worlds that run right in a browser tab with WebGL and three.js (<a href="https://x.com/Delroy715/status/2103738307033416132">like this one</a>).</p><p>And it clicked: I could build Yosemite. Not a painting of it &#8212; a real, immersive 3D model of the valley, where I could go to my favorite locations and experiment with any time of day, any day of the year.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;b69207f9-c065-4b48-a354-56e09ee97265&quot;,&quot;duration&quot;:null}"></div><p>I set myself a high bar:</p><ul><li><p><strong>The light had to be as real as possible.</strong> Real sun position for the date and hour, a physically based sky, clouds that catch the light the way they do at golden hour, moonlight, stars.</p></li><li><p><strong>The water had to look real.</strong> The Merced, the falls, the mist; water makes Yosemite&#8217;s magic.</p></li><li><p><strong>The place had to feel both detailed and huge.</strong> Granite you could walk up to, and a horizon 36 km away.</p></li><li><p><strong>It had to hold 60 frames per second. </strong>Which, let me tell you was tricky for a scene this massive.</p></li><li><p><strong>And the camera had to look and work like my real Hasselblad.</strong> Not a screenshot button &#8212; a camera. Lenses, a waist-level finder, a leaf shutter, film.</p></li></ul><h2>The head start: GlassMeter</h2><p>That last point is where I had an unfair advantage.</p><p>For the past while I've been building <a href="https://glass-works.ai">GlassMeter</a>, an iOS app that turns your phone into a professional light meter and camera, modeled on the mechanical and optical experience of a classic medium-format camera. Under the hood, GlassMeter is really a simulator: it meters a scene the way a photographer does (average, multi-spot, the Zone System from 0 to X), it knows the optics of real lenses &#8212; focal lengths, apertures, depth of field, minimum focus &#8212; it models filters with their real stop factors, and it simulates film: each stock's color response, characteristic curve, grain, halation and reciprocity failure.</p><p>All of that already existed. So instead of building a camera simulator for the web, I ported GlassMeter's into the browser. The phone floating beside the scene in Yosemite <em>is</em> GlassMeter: the same histogram, the same spot meter, the same METER button that solves the exposure, the same 30 film stocks (and a digital reference). The difference is that instead of pointing it at my living room, you're pointing it at El Capitan.</p><p>That's how the two projects connect. GlassMeter is the brain of the camera; the Yosemite experience is a world worth pointing it 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_!N8vd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N8vd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!N8vd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!N8vd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!N8vd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N8vd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The GlassMeter app beside the scene, with three spot readings on El Capitan's wall, each labelled with its zone.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The GlassMeter app beside the scene, with three spot readings on El Capitan's wall, each labelled with its zone." title="The GlassMeter app beside the scene, with three spot readings on El Capitan's wall, each labelled with its zone." srcset="https://substackcdn.com/image/fetch/$s_!N8vd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!N8vd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!N8vd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!N8vd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff01098fb-f735-4cc5-8277-6af2abdb51eb_1920x1080.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 GlassMeter app beside the scene, with three spot readings on El Capitan's wall, each labelled with its zone.</figcaption></figure></div><h2>Building the valley from real data</h2><p>Everything in the scene comes from public data. There are no purchased models and no stock textures.</p><p><strong>The ground</strong> is USGS 3DEP elevation data at four resolutions: 60 m out to the horizon, 10 m across the valley, 5 m for the valley core, and <strong>1-meter airborne lidar</strong> in a 640 m square around each of the ten viewpoints. It streams in as you move, rendered with a level-of-detail scheme so distant ridges cost almost nothing and the ground at your feet is sharp. It's draped with USDA aerial imagery down to 0.6 m.</p><p><strong>The big walls</strong> were the hardest part. From above, a 3,000-foot vertical cliff is a single line of pixels, so aerial imagery can't paint it. For El Capitan I used the USGS's ground-based lidar survey of the southeast face, which was captured with a camera, so every point carries real color. For Bridalveil and Leaning Tower I used airborne lidar and its near-infrared return intensity as a stand-in for the rock's brightness.</p><p>Half Dome became personal. The lidar gives its shape, but no color. So I used <strong>my own photos of Half Dome</strong>. A script finds where each photo was taken by matching the skyline in the picture against the elevation model, then projects the pixels back onto the lidar surface. Nine of my photos now paint Half Dome's face. When you look at it in the simulator, you're partly looking at my own trips to the valley.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xTxQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xTxQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xTxQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xTxQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xTxQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xTxQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A medium-format camera on a tripod at Glacier Point, with Half Dome and the high country behind it.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A medium-format camera on a tripod at Glacier Point, with Half Dome and the high country behind it." title="A medium-format camera on a tripod at Glacier Point, with Half Dome and the high country behind it." srcset="https://substackcdn.com/image/fetch/$s_!xTxQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xTxQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xTxQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xTxQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b78e65-823d-43a1-b270-4d23b44bead1_1920x1080.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 medium-format camera on a tripod at Glacier Point, with Half Dome and the high country behind it.</figcaption></figure></div><p><strong>The trees</strong> are real species in the right places: ponderosa and Jeffrey pine, incense cedar, black oak, dogwood, manzanita, meadow grasses and lupine. The dogwoods and oaks turn in autumn, and the meadows cure golden by August. Landmark trees are placed where they really stand, like the elm in Cook's Meadow that everyone uses to frame Half Dome. I&#8217;ll probably want to keep working on the tree models I use, but that&#8217;ll be anther day.</p><h2>Making the light real</h2><p>This is where most of the time went, and where I learned the most.</p><p><strong>The sun and sky.</strong> The sun is computed for the exact date and time in Yosemite, and the sky is a physically based atmosphere model. The light arriving at the valley floor at 6:40 pm in October is the color it should be, because it traveled through the right amount of air.</p><p><strong>Clouds that catch the light.</strong> My first clouds looked like cotton balls pasted on the sky. Real clouds at golden hour are lit by a sun that's a different color at every altitude. By the time the valley is in shadow, a thunderhead's top at 11 km is still in direct, deep-orange sun. The clouds now know that. There are eleven weather presets &#8212; fair cumulus, morning fog, a storm on the horizon, lenticulars, a mackerel sky, snowfall, the clearing after a snow &#8212; and each one is lit correctly for the hour.</p><p>Two bugs I found while making the video for this post. The first: at dusk, the clouds blew out to a glowing white. At night the whole scene is scaled up so tiny light levels stay precise, and the clouds' sky-light had a fixed floor that didn't dim after sunset. Scaled up, dusk clouds came out about a thousand times too bright.</p><p>The second was better. Twenty minutes after sunset, the sky overhead turned magenta, then red. The atmosphere model was letting sunlight reach air that sits in the Earth's shadow, by computing a path straight through the planet. Light that has crossed that much air comes out deep red, so blue hour came out red. With the Earth's shadow respected, blue hour came back: pink at the horizon, deep blue overhead, and then the first stars.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iDB8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iDB8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iDB8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iDB8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iDB8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iDB8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Towering thunderheads over the high country beyond Half Dome, lit orange by a low sun.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Towering thunderheads over the high country beyond Half Dome, lit orange by a low sun." title="Towering thunderheads over the high country beyond Half Dome, lit orange by a low sun." srcset="https://substackcdn.com/image/fetch/$s_!iDB8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iDB8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iDB8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iDB8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3135d9a6-87ba-4da6-97f4-496b3e6341e2_1920x1080.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Towering thunderheads over the high country beyond Half Dome, lit orange by a low sun.</figcaption></figure></div><p><strong>An eye, not a camera.</strong> The main view adapts like your eye does. It meters its own image every quarter-second and settles on an exposure the way your pupils would, so a moonlit valley reads as night and not as a black screen.</p><p><strong>The real Moon.</strong> At one point the Moon was a blurry disc. Now it's NASA's Lunar Reconnaissance Orbiter imagery, placed with the International Astronomical Union's rotation model. The phase, its position in the sky, and even the slight wobble and tilt of the Moon's face (libration) are correct for the date. Behind it are 9,096 stars from the Yale Bright Star Catalogue and the Milky Way from ESA's Gaia survey (NASA SVS). Long exposures on the bulb setting draw real star trails as the Earth turns.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g4po!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g4po!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!g4po!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!g4po!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!g4po!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g4po!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The full Moon over Yosemite Valley at dusk, its maria visible.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The full Moon over Yosemite Valley at dusk, its maria visible." title="The full Moon over Yosemite Valley at dusk, its maria visible." srcset="https://substackcdn.com/image/fetch/$s_!g4po!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!g4po!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!g4po!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!g4po!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F311551bd-6328-4dd0-9180-5dbf13db1c49_1920x1080.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 full Moon over Yosemite Valley at dusk, its maria visible.</figcaption></figure></div><h2>Water, seasons and the winter answer</h2><p>The Merced is modeled as clear snowmelt, with reflections that brighten at grazing angles, depth that absorbs light, a cobbled riverbed with caustics, and ripples that follow the current. The waterfalls fall at the speed things actually fall, stretching into streaks, with spray, mist and rainbows where the geometry puts them.</p><p>The falls also follow the calendar. Early on I thought I had broken Yosemite Falls: it had dwindled to almost nothing. It hadn't broken. It was September, and by late summer the real Yosemite Falls shrinks to a thin ribbon, and in a dry year it stops altogether. I&#8217;m going to pretend we&#8217;re not in a perpetual drought and keep at least a little flow even in September.</p><p>Which brings me back to my son's question. Set the date to January, choose "After the snow," and the answer is right there: snow down to the rims, the valley floor dusted white, El Capitan and Bridalveil lit by a low winter sun. (<a href="https://glass-works.ai/503cx?m=winter-tunnel-view">Check it out.</a>) Choose "Morning fog," and the valley fills with it. Open <strong>Places &amp; moments</strong>, pick Firefall, and it takes you to El Capitan Meadow in mid-February, at the minute the last light leaves Horsetail Fall &#8212; computed from the sun, not hard-coded.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dLCT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dLCT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dLCT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dLCT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dLCT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dLCT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Horsetail Fall on El Capitan's east edge catching the last sunlight while the wall around it falls into shade.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Horsetail Fall on El Capitan's east edge catching the last sunlight while the wall around it falls into shade." title="Horsetail Fall on El Capitan's east edge catching the last sunlight while the wall around it falls into shade." srcset="https://substackcdn.com/image/fetch/$s_!dLCT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dLCT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dLCT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dLCT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07f40028-6152-4bf4-977e-812c3301c53a_1920x1080.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Horsetail Fall on El Capitan's east edge catching the last sunlight while the wall around it falls into shade.</figcaption></figure></div><h2>Making it feel alive</h2><p>A still valley feels like a diorama, so I added life.</p><p>There are mule deer, black bears, coyotes mousing in the meadows, bobcats, gray squirrels, bald eagles riding thermals, raven pairs doing barrel rolls, acorn woodpeckers, dippers bobbing on river rocks, mergansers, butterflies, and bats at dusk. They aren't on rails. Each animal plans its route around rivers and cliffs, walks in single file when it should, grazes, looks up, and bolts when a predator comes by. In an early version about 60% of the deer ended up pacing back and forth on the wrong side of the Merced. Now, in a stress test of 120 animals, every one gets where it's going.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gWVM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gWVM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gWVM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gWVM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gWVM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gWVM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A mule deer doe and two spotted fawns grazing among lupine in Cook's Meadow.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A mule deer doe and two spotted fawns grazing among lupine in Cook's Meadow." title="A mule deer doe and two spotted fawns grazing among lupine in Cook's Meadow." srcset="https://substackcdn.com/image/fetch/$s_!gWVM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gWVM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gWVM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gWVM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8792bc-f62c-4fa1-8baf-1a82aba89b58_1920x1080.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 mule deer doe and two spotted fawns grazing among lupine in Cook's Meadow.</figcaption></figure></div><p>The whole valley is also <strong>synthesized in sound</strong>: wind, the falls' roar by flow and distance, the river, rain, a dawn chorus, coyotes at dusk, crickets and an owl at night, and the camera's own mechanics. There are no recordings; it's all generated live in the browser.</p><h2>The camera</h2><p>The camera on the tripod is modeled on the 503CX I shoot with, part by part: the body, the film magazine with its dark slide, the winding crank, and the waist-level finder that unfolds with its magnifier. Open the exploded view and every piece separates and labels itself. Press the shutter and you see &#8212; and hear &#8212; the mirror flip up, the leaf shutter open and close, and the crank wind on.</p><p>There are eleven lenses from a 30 mm fisheye to a 500 mm telephoto, each with its real focal length, aperture range, minimum focus and depth of field. Look down into the finder and you see the ground glass, reversed left to right like the real thing. Press the stop-down lever and it darkens as the aperture closes &#8212; f/4 to f/16 is sixteen times less light &#8212; just as it does on my camera, with your eye winning some of it back as it adapts.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!78xu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!78xu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!78xu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!78xu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!78xu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!78xu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Looking down into the camera's waist-level finder: the ground glass shows Half Dome, reversed left to right.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Looking down into the camera's waist-level finder: the ground glass shows Half Dome, reversed left to right." title="Looking down into the camera's waist-level finder: the ground glass shows Half Dome, reversed left to right." srcset="https://substackcdn.com/image/fetch/$s_!78xu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!78xu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!78xu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!78xu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c74db-8884-473a-9279-ade48b450a45_1920x1080.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Looking down into the camera's waist-level finder: the ground glass shows Half Dome, reversed left to right.</figcaption></figure></div><p>When you take a photo, it goes through GlassMeter's film pipeline and develops into a print on the page. A roll fills a contact sheet. If you want, you can hand a frame to Google's Gemini with your own API key for a darkroom-style rendition.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OrMF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OrMF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OrMF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OrMF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OrMF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OrMF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A contact sheet of five frames from the simulator: Valley View on Portra, Half Dome at sunset on Velvia, El Capitan on Tri-X, Half Dome reflected in the Merced, and Tunnel View in snow.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A contact sheet of five frames from the simulator: Valley View on Portra, Half Dome at sunset on Velvia, El Capitan on Tri-X, Half Dome reflected in the Merced, and Tunnel View in snow." title="A contact sheet of five frames from the simulator: Valley View on Portra, Half Dome at sunset on Velvia, El Capitan on Tri-X, Half Dome reflected in the Merced, and Tunnel View in snow." srcset="https://substackcdn.com/image/fetch/$s_!OrMF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OrMF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OrMF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OrMF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb180e371-e4c2-4901-a10b-09dc3518790a_1920x1080.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 contact sheet of five frames from the simulator: Valley View on Portra, Half Dome at sunset on Velvia, El Capitan on Tri-X, Half Dome reflected in the Merced, and Tunnel View in snow.</figcaption></figure></div><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f7d0448-f86c-4a3b-abff-f43485772340_768x768.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/36928acb-d97e-4c29-8d0c-067951dea38c_4096x4096.jpeg&quot;}],&quot;caption&quot;:&quot;Left: the simulator's print on Tri-X. Right: the same frame developed by Gemini&quot;,&quot;alt&quot;:&quot;Tunnel View developed by Gemini&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aea1b2d3-35a0-4192-ae36-0c714523e4ba_1456x720.png&quot;}},&quot;isEditorNode&quot;:true}"></div><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/370bac99-09e2-4ce0-bb58-749b3a22112a_768x768.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0976c15f-fa48-4d5b-aafd-d4cd195938dc_4096x4096.jpeg&quot;}],&quot;caption&quot;:&quot;Left: the simulator's print on Velvia 50. Right: the same frame developed by Gemini.&quot;,&quot;alt&quot;:&quot;Glacier Point developed by Gemini&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8293f96-87d4-4c0c-be5a-e43b7c8e352c_1456x720.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p></p><h2>The hard part: 60 frames per second</h2><p>All of that has to run at 60 fps in a browser tab. A few of the things that made it possible:</p><ul><li><p><strong>Reversed depth.</strong> When your scene spans from a lens element a few centimeters away to a ridge 36 km out, ordinary depth buffers run out of precision. A reversed floating-point depth buffer fixed the flickering. It also let the GPU skip hidden pixels early, which turned out to be the single biggest speedup.</p></li><li><p><strong>Precision at a distance.</strong> The world is kilometers from the origin, and 32-bit floats get coarse out there. At one point the image in the finder was smearing into blocks. The cause was the temporal anti-aliasing reprojecting in world coordinates. Doing that math relative to the camera, in double precision on the CPU, made it sharp again.</p></li><li><p><strong>Adaptive resolution.</strong> The renderer watches for missed frames and trades a little resolution to keep motion smooth, then quietly steps back up.</p></li><li><p><strong>Heavy work off the main thread.</strong> Animal meshes, vegetation textures and data decoding run in background workers, so nothing stalls a frame.</p></li></ul><p>On my M4 Max it holds 55&#8211;60 fps with the GlassMeter panel open, and the CPU side of a frame takes about 3 ms. I haven&#8217;t tested it on lower powered devices, and I&#8217;m sure it&#8217;ll stutter a bit there.</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>Plan your shot</h2><p>I&#8217;m really excited to use this tool to help plan my next trip to Yosemite, and  when I showed this to my son yesterday he played with it for nearly an hour (he might have been avoiding his homework!).</p><p>For planning, I&#8217;ve made it easy with a section called <strong>Places &amp; moments</strong>. Each of my ten favorite viewpoints in the Park are there with a line about what you'll see, and under each one are its moments: a day, an hour, the weather and a lens, set up for you with one click. Some are the page's own suggestions &#8212; January snow at Tunnel View, alpenglow from Glacier Point, Yosemite Falls at peak flow. Ten are reconstructions of where and when Ansel Adams made some of his best-known Yosemite photographs, with the sources for each.</p><p>Or start from scratch. Pick a spot. Pick a day. Scrub the clock and watch the light come across the valley. Swap to a longer lens, meter the highlights on Half Dome and the shadows in the trees, choose Velvia or Tri-X, and take the picture. Then go back and do it again in January.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1W7x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1W7x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1W7x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1W7x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1W7x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1W7x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg" width="1920" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;resizeWidth&quot;:1920,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Alpenglow on Half Dome from Glacier Point, under a mackerel sky lit gold by the setting sun.&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Alpenglow on Half Dome from Glacier Point, under a mackerel sky lit gold by the setting sun." title="Alpenglow on Half Dome from Glacier Point, under a mackerel sky lit gold by the setting sun." srcset="https://substackcdn.com/image/fetch/$s_!1W7x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1W7x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1W7x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1W7x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9559ae0f-1414-4687-890a-bd1495be6684_1920x1080.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Alpenglow on Half Dome from Glacier Point, under a mackerel sky lit gold by the setting sun.</figcaption></figure></div><p> <em>Alpenglow on Half Dome from Glacier Point, 27 September.</em></p><p>I don't think a simulator replaces being there &#8212; nothing replaces the cold air at Tunnel View at 6 am. But it's the closest thing I've found to walking in with a camera and a plan. And it answered a question from a kid who wants to know what winter looks like through a viewfinder.</p><h2>Five scenes to try</h2><p>Each link opens the page at that place, day and hour (on a desktop browser). Press <strong>K</strong> anywhere to copy a link to your own scene.</p><ul><li><p><strong><a href="https://glass-works.ai/503cx?m=winter-tunnel-view">Tunnel View after a January snow</a></strong> &#8212; the answer to my son's question, on Tri-X.</p></li><li><p><strong><a href="https://glass-works.ai/503cx?m=alpenglow-glacier-point">Alpenglow on Half Dome</a></strong> &#8212; the last light from Glacier Point, on Velvia 50.</p></li><li><p><strong><a href="https://glass-works.ai/503cx?m=firefall">Firefall</a></strong> &#8212; Horsetail Fall at the minute the sun leaves it, in mid-February.</p></li><li><p><strong><a href="https://glass-works.ai/503cx?m=morning-fog-tunnel-view">Morning fog</a></strong> &#8212; the valley filled with fog at first light.</p></li><li><p><strong><a href="https://glass-works.ai/503cx?m=moonrise-tunnel-view">Moonrise over the valley</a></strong> &#8212; the real Moon, in its real place, for that night.</p></li></ul><h2>How I built it</h2><p>I built this heavily with AI tools. I use a mix of Antigravity, Gemini and Claude. I set the direction and the bar: what real light looks like, how my camera behaves, which viewpoints matter. AI wrote the code, fetched and processed the public datasets, and I checked its work by rendering the scene and looking at the frames, a lot like reviewing a contact sheet. When something felt wrong &#8212; the blob Moon, the pale shade, clouds that didn't catch the light &#8212; I'd describe what I saw, and it would chase the cause down to the physics. I used different AI models to run end-to-end audits of usability, performance and code quality; each time fixing it&#8217;s discoveries. Even the video was made this way: every frame rendered by the live page, then cut to the beat of the music which I generated in <a href="https://www.flowmusic.app/song/32388ee5-5b09-4a4b-94ed-41d3cbc08471">Google Flow Music</a>.</p><p><strong>Try it:</strong> <a href="https://glass-works.ai/503cx">glass-works.ai/503cx</a> <em>(desktop browser)</em> <strong>GlassMeter</strong> is in beta on iOS: <a href="https://glass-works.ai">glass-works.ai</a></p><div><hr></div><p><em>Data: USGS 3DEP elevation and lidar, the USGS El Capitan ground-based lidar survey, USDA NAIP imagery, USGS hydrography (all public domain); NASA LRO lunar imagery via NASA SVS; the Milky Way from ESA Gaia via NASA SVS; the Yale Bright Star Catalogue. Built with three.js.</em></p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/virtual-yosemite-photo-tour?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/virtual-yosemite-photo-tour?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/virtual-yosemite-photo-tour?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Zen and the Art of AI Maintenance]]></title><description><![CDATA[You know quality when you see it]]></description><link>https://trond.ai/p/zen-and-the-art-of-ai-maintenance</link><guid isPermaLink="false">https://trond.ai/p/zen-and-the-art-of-ai-maintenance</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 08 Sep 2026 16:37:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jBJG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_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_!jBJG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jBJG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!jBJG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!jBJG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!jBJG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jBJG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6766f194-e479-48c1-9302-88ee8be8023c_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;:5764479,&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/214734519?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_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_!jBJG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!jBJG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!jBJG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!jBJG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6766f194-e479-48c1-9302-88ee8be8023c_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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 favorite books is Robert Pirsig&#8217;s <em>Zen and the Art of Motorcycle Maintenance</em>. Early on, he spins the question that haunts most of the product work I do:</p><blockquote><p>Quality&#8212;you know what it is, yet you don&#8217;t know what it is. But that&#8217;s self-contradictory. But some things are better than others, that is, they have more quality. But when you try to say what the quality is, apart from the things that have it, it all goes poof! There&#8217;s nothing to talk about. But if you can&#8217;t say what Quality is, how do you know what it is, or how do you know that it even exists?</p></blockquote><p>Pirsig never really defines Quality, and I think that&#8217;s the point. You recognize a good interface, a good product decision, a good paragraph, before you can fully explain why. Classical analysis can take the motorcycle apart. Romantic attention can feel the ride. Quality is what shows up before that split, at what he later calls the <strong>cutting edge of the present</strong>.</p><p>Not being able to easily define quality is an awkward fact for those of us designing with AI agents. Models are fantastic at producing statistically likely next tokens. But they usually suck at caring whether the result is good. This means a lot of the interesting work right now is not &#8220;better prompts.&#8221; It&#8217;s figuring out how to represent Quality well enough that an agent can aim at it, without pretending the representation itself <em>is</em> Quality.</p><p>Taste cannot be fully automated, but it can be captured, checked, and reused. That&#8217;s a lot of the goal right now. How can we capture our own sense of taste well enough that an AI can repeat it reliably?</p><div class="paywall-jump" data-component-name="PaywallToDOM"></div><h2>Different ways people are capturing taste</h2><p>I&#8217;ve been working to understand how people think about this fundamental question. So recently I&#8217;ve been looking at a cluster of tools that all try to put judgment into AI systems. They disagree on <em>how and where</em> that somewhere should be, which is interesting, but each approach help us understand the techniques that might work.</p><h3>Judgment as a skill you run on outputs</h3><p>One author I follow (<a href="https://x.com/nurijanian/status/2096282713292709952">nurijanian</a>) has been writing PM skills for agents that look less like chat tricks and more like review muscles. <code>/first-principles</code> forces a product decision to reveal what has to be true to better understand it&#8217;s truth. <code>/de-clever</code> attacks the twin failure modes of AI fluff and human cleverness to root out common errors. He <a href="https://x.com/nurijanian/status/2095889371778236716">argues you should run those skills against the output</a>, rather than against the chat that produced it, because it&#8217;s the artifact that matters &#8212; not merely the process.</p><p>To grade product outcomes, all that matters is the impact they create with users. We attempt to predict impact by judging outputs on a given set of  scenarios. We also dogfood our own products, because getting more people to try their personal scenarios is helpful for assessing outcomes with real-ish users. Increasingly, though, PMs construct pools of representative examples called evals, then set criteria of judgment to test outputs. If the evals and criteria are representative of what happens in the world, we have a predictive process for estimating impact.</p><h3>Craft as a workflow with built-in verification</h3><p><a href="https://github.com/kajisho5/ffmpeg-skill">ffmpeg-skill</a> takes a different path. Instead of asking the model to &#8220;know FFmpeg,&#8221; it gives the agent a fixed editing workflow and twenty-one typed tools: probe the file, prefer lossless operations, plan with <code>--dry-run</code>, check the deliverable against the destination platform, then actually look at a contact sheet before declaring victory.</p><p>The skill&#8217;s own README is blunt about why this exists: an agent that merely &#8220;knows FFmpeg&#8221; still guesses frame rates, re-encodes files that only needed a stream copy, and reports done without opening the result. The package encodes craft as sequence and verification. Format checks (codec, size, true peak) can be fixed mechanically. Judgment checks (crop that loses the subject, loudness that boosts ambience into noise) still require a human call, and the skill is designed to surface those instead of papering over them.</p><p>Where nurijanian&#8217;s skills are portable taste for decisions, ffmpeg-skill is portable expertise encoded as taste within a domain. The agent doesn&#8217;t invent what good video delivery means every time. Someone already wrote down the order of operations and what &#8220;done&#8221; looks like.</p><h3>Design systems as files agents can read</h3><p><a href="https://github.com/google-labs-code/design.md">DESIGN.md</a>, open-sourced by Google Labs (the world I work in), is the visual version of the same bet, and I think it&#8217;s one of the more important anti-slop tools shipping right now. The format is intentionally simple and extensible: machine-readable tokens in YAML paired with human-readable rationale written in markdown. </p><p>Tokens give exact values an AI can reuse. Prose tells the agent <em>why</em> those values exist and how to apply them when the tokens don&#8217;t cover everything. The CLI can lint broken references, check contrast, diff two versions for regressions, and export into preferred token formats, so the file can sit in a wider design pipeline rather than living as a one-off prompt. The reusability is the point.</p><p>The reason this matters for AI UI is that models have a strong prior toward a handful of generated-design tells: blue-green gradients on every hero, neon accents on dark mode dashboards, left-edge accent bars on too many cards, Inter everywhere, purple CTAs, identical rounded rectangles. Without a stronger identity to obey, agents reproduce the same crap all the time. And it drives me crazy! DESIGN.md is a powerful tool for overcoming this average slop with your you own sense of taste.</p><p><a href="https://x.com/rauchg/status/2094541309579235680">Guillermo Rauch</a> put it nicely: </p><blockquote><p>Your next design system is Markdown, and DESIGN.md is how you fight slop while scaling design taste across a large organization. </p></blockquote><p>The ecosystem around the format is growing fast enough that you don&#8217;t have to start from a blank file. <a href="https://github.com/VoltAgent/awesome-design-md">VoltAgent&#8217;s awesome-design-md</a> is a curated archive of DESIGN.md files extracted from real product sites, each with light and dark previews you can drop into a project and point an agent at. Other catalogs are appearing too. The point isn&#8217;t to clone someone else&#8217;s brand. It&#8217;s that the representation is portable enough for people to share, fork, lint, and improve in public.</p><p>DESIGN.MD does not invent or even guarantee good design judgment, it only repeats it reliably. You still need to encode your sense of taste for it to do anything useful.</p><h2>Critics help enforce Quality</h2><p>You may have noticed that AI is lazy. If it can find a shortcut, it&#8217;s always going to exploit it and gaslight you into thinking it did the work thoroughly. So you need a system to overcome this and many other pedantic errors in the process. I wrote one approach to solving this conundrum in <a href="https://trond.ai/p/check-your-work">Check Your Work</a>, using the math worksheet generator as the example. </p><p>In that system, I have one model that proposes problems, a separate SymPy verifier to check the math, and a wholly different critic system to grade whether the worksheet teaches the requested topic and gets harder across the page. Answer keys are meticulously audited and is transparent about what the AI system can&#8217;t honestly judge. These are all part of the rules I&#8217;ve built to enforce quality aligned with my judgement of what good looks like.</p><p>My Worksheet tool is one example of a critic-integrated loop. Critics are an essential part of how we <strong>express quality</strong> in a system we ship. They are not &#8220;quality&#8221; on their own, but critics play an important role in enforcing the rules that lead to my subjective point of view on quality.</p><p>Pirsig ran into a version in a scenario he plays out in his books. He talks about a teacher named Phaedrus teaching rhetoric. Phaedrus asked students to write about Quality without giving them a definition. The class could easily rank essays from better to worse with surprising agreement, but they struggled with a shared definition. That&#8217;s because people recognize quality but are broadly unable to define it. Grading outputs as a class only made sense because that recognition was shared enough to act on. An eval suite with a critic system is a modern version of the same bet: </p><blockquote><p>Quality is real enough to show up as a pattern across many cases, and it&#8217;s possible to design a critic to recognize enough of that pattern to be useful.</p></blockquote><p>When you build these systems it&#8217;s important that you carefully check what the grader is actually measuring. In the worksheet system, an over-strict numeric comparison once forced the authoring model to round good physics constants into tidier wrong ones. The path of least resistance became worse math in order to satisfy a checker that thought it was defending Quality. If your verification rejects correct answers, it will eventually manufacture wrong ones. It&#8217;s a common trap to watch out for.</p><p>Don&#8217;t confuse the scoreboard with the game. An eval suite and a grader are just the Quality judgments you chose to defend, written precisely enough that an agent can be held to them. When the suite goes green, you have evidence. When it goes red, you have a conversation about whether the product failed or the standard did. That is how dogfooding-plus-eval pools help PMs estimate user impact before a launch: the representation has to keep earning its keep against reality.</p><h2>Quality as an ever moving target</h2><p>In <em>Lila</em>, the follow-up to <em>Zen</em>, Pirsig splits Quality into Dynamic and static forms. I find this to be one of the most profound points he makes and it&#8217;s sad that it&#8217;s often lost on readers, because most people only remember the motorcycle book. </p><blockquote><p>Dynamic Quality is the pre-intellectual cutting edge of reality, the source of all things, completely simple and always new&#8230; Static Quality emerges in the wake of Dynamic Quality. It is old and complex. It always contains a component of memory.</p></blockquote><p>Dynamic Quality is the living edge of &#8220;this is better.&#8221; Static patterns are what remain after that judgment: the habits, standards, and files you can teach. Skills, DESIGN.md files, and graders are static patterns. They are incredibly useful. They are also <strong>lagging records of taste</strong> that already happened in a human mind. If you freeze them too hard, you get a museum. If you never write them down, every agent session starts from zero and drifts back toward the model&#8217;s prior.</p><p>We&#8217;re starting to see notions of Dynamic Quality in AI as well. Vercel recently wrote up <a href="https://vercel.com/blog/how-our-agents-build-on-brand-pages-with-design-md">how their agents use design.md</a> in practice. They pair a public guidance file with a bounded stylesheet and an evaluation loop. The file doesn&#8217;t only describe brand; it names the recurring generated-design patterns they never want to see, so agents can recognize and avoid them. </p><p>They keep improving the system by only freezing the steps. When they generate anything new against the current guidance, they review the output, and encode accepted corrections back into the system or critics to have a dynamic quality system that evolves as tastes change. Guidance that helped one artifact and hurt another gets revised and standards that no longer prove fruitful are dropped. This notion of dynamic quality seems to be driving results for Vercel. In one matched test they shared, pages generated with their design.md showed <strong>57% fewer failures</strong> than pages generated without it. I&#8217;ll be interested to see how this evolves over epochs of iteration and refinement.  Will it truly be as dynamic as it seems?</p><h2>Takeaways</h2><p>The best AI systems today no longer try to encode taste into a single heroic prompt. They put clear indicators and instructions into reusable skills, implement critics to review artifacts, and build workflows that refuse to finish without verification. Design files carry instructions and reasoning, evals keep score, and results are incorporated into the system to keep them fresh.</p><p>None of that replaces the Pirsig problem. You still have to know Quality when you see it. The new craft is deciding which parts of that knowing can be written down, which parts can be checked by a machine, and which parts must only be judged by a person with a well calibrated sense of taste.</p><p>If you&#8217;ve found a representation of taste that still works after real users touched the product, I want to hear what form it took: skill, file, hook, eval, or something weirder. How are you building AI to deliver dynamic quality?</p>]]></content:encoded></item><item><title><![CDATA[Bring Your Own Agent]]></title><description><![CDATA[Don&#8217;t make me use your agent &#8212; it probably sucks]]></description><link>https://trond.ai/p/bring-your-own-agent</link><guid isPermaLink="false">https://trond.ai/p/bring-your-own-agent</guid><dc:creator><![CDATA[Trond Wuellner]]></dc:creator><pubDate>Tue, 25 Aug 2026 14:28:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!E12b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.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_!E12b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E12b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png 424w, https://substackcdn.com/image/fetch/$s_!E12b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png 848w, https://substackcdn.com/image/fetch/$s_!E12b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png 1272w, https://substackcdn.com/image/fetch/$s_!E12b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E12b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png" width="1456" height="745" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:745,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:172898,&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/205276169?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.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_!E12b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png 424w, https://substackcdn.com/image/fetch/$s_!E12b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png 848w, https://substackcdn.com/image/fetch/$s_!E12b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.png 1272w, https://substackcdn.com/image/fetch/$s_!E12b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0105774e-53dd-4320-af0b-26bda35a7c71_2274x1164.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In June, I wrote about <a href="https://trond.ai/p/build-the-travel-app-youve-always">building the travel app I'd always wanted</a>. I turned our family's messy travel doc into a pretty rad app (called <a href="https://trond.studio/tripfold">Tripfold</a>) that I came to depend on all summer. It kept all of our logistics, plans, booking barcodes and restaurant ideas in neat order on a pretty complex itinerary. I even had it make Gemini Notebook audio overviews with a history lesson about every place we visited. It&#8217;s pretty cool. But I&#8217;m not <em>(just)</em> here to brag about an app I built. I actually want to talk about something that making this app forced me to realize:</p><div class="callout-block" data-callout="true"><p style="text-align: center;"><em><strong>My app is never going to make enough money to justify building and paying for a custom agent in it. Yours won&#8217;t either.</strong></em></p></div><p>On Friday, Ali Spittel <a href="https://x.com/ASpittel/status/2090889137062826240">on X</a> explained it better than I ever could: </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2IvC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2IvC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png 424w, https://substackcdn.com/image/fetch/$s_!2IvC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png 848w, https://substackcdn.com/image/fetch/$s_!2IvC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png 1272w, https://substackcdn.com/image/fetch/$s_!2IvC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2IvC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png" width="1210" height="258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:258,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:56256,&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/205276169?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.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_!2IvC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png 424w, https://substackcdn.com/image/fetch/$s_!2IvC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png 848w, https://substackcdn.com/image/fetch/$s_!2IvC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png 1272w, https://substackcdn.com/image/fetch/$s_!2IvC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764215ba-6bdf-4a62-b4eb-9a7c33a81709_1210x258.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>Ali is right. Users don't want to use your agent, they want to use the agent they&#8217;ve already set up and trust. As I write this, her tweet is sitting at 4.5K likes and 669K views, and the replies are full of people describing the exact shape I've been building toward. That's not vendors talking. That's users. The pull is coming from the demand side, which is the side that <em>always</em><strong> </strong>wins.</p><h2>The mistake everyone is making</h2><p>Say "add AI to your app" today and people reach for the same move: wire up a model, pay per token, bolt a chatbot into a corner that most users tap once and never open again. Pete Koomen has the sharpest name for what you get. A <a href="https://koomen.dev/essays/horseless-carriages/">horseless carriage</a>: AI bolted onto software still shaped for a world that didn't have it yet. And now you own a running cost that scales with usage, a model you have to keep current, and a feature that competes (badly) with the general-purpose assistants from the big boys.</p><p>Your app is probably too small to do that. Don't put an agent inside your app. Let the user bring their own: the Claude or ChatGPT or Gemini subscription they're already paying for. It&#8217;s just better.</p><p>For many apps, adding an AI agent can be as simple as wiring up an <a href="https://www.anthropic.com/news/model-context-protocol">MCP</a> between your app and a host agent. The user points their assistant at the setup instructions, and forevermore their agent can operate your app. Your app, meanwhile, focuses on the one thing while enjoying the benefits of a powerful AI coworker.</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>Why it works now</h2><p>This didn't work a year ago, but it does now because three important things changed.</p><p><strong>The approach is standardized.</strong> MCP shipped out of Anthropic in late 2024. OpenAI adopted it in March 2025, and by that December it was handed to a Linux Foundation body that Anthropic, OpenAI, Google, Microsoft, and AWS all sit on. There are already north of 10,000 public MCP servers. And the plumbing an app used to invent for itself is getting absorbed into the protocol. All you need to do is implement it for your app.</p><p><strong>The user already bought the brain.</strong> Tens of millions of people pay monthly for a capable assistant. That's a subsidy sitting around for you to use. Tap into that token flow, and every session starts with a frontier model that's already paid for, and fully up to speed on the user&#8217;s context. You get to build a great  experience rather than figuring out how to survive as a token middle-man.</p><p><strong>Free is better than paid.</strong> For many apps your backend can become dumb storage. For Tripfold, I found that a whole trip, every flight, hotel, and ticket, is about 250 KB encrypted. Serving that to a hundred thousand people a few times a day is a handful of gigabytes; on object storage with no egress fees, that's a couple of dollars a month. On CloudKit it's zero, because the bytes count against each user's own iCloud, not your bill. The expensive, stateful backend and strangling inference costs dissolve.</p><p>Stack those benefits up: near-zero marginal cost, no per-token bleed, a frontier-grade engine doing the work, and happier users. A pretty good deal.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_GdG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_GdG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!_GdG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!_GdG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!_GdG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_GdG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/120a44a0-0479-4a0c-ad49-5e02719b2daf_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;:6172454,&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/205276169?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_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_!_GdG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!_GdG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!_GdG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!_GdG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120a44a0-0479-4a0c-ad49-5e02719b2daf_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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>The catch</h2><p>Well, the most obvious issue is you&#8217;ve now invited a 3rd party into your user relationship. For users this may become a positive, but for most developers and investors it&#8217;s a total non-starter. If your onboarding experience asks users which agent they prefer, you&#8217;re becoming a distribution surface for those providers as much as anything else. It might be a revenue opportunity, but it&#8217;s surely smaller than the home run of owning the whole user experience.</p><p>As the barriers to building apps collapse, we&#8217;re seeing a flood of new apps.  Almost none of these are going to get distribution and even fewer will be able to eke out a real business on top of buying tokens. Developers who don&#8217;t want to subsidize the growth phase either need to move the inference for these experiences onto devices or bundle it into agents a user already pays for.  The economics just won&#8217;t work otherwise.</p><p>As this shift starts accelerating, notice where the moat ends up. The plumbing (the queue, the auth, the sync) is commoditizing; the platform giants are racing to own inference, and agent relationships will increasingly depend on deep cross-domain context that&#8217;s hard to do sub-scale. What doesn't commoditize is the taste layer: the craft that makes a generic agent do amazing work on your specific domain. Build your moat there. Rent the rest.</p><h2>What flips with this approach?</h2><p>When you stop competing on model quality, which is a race you'd lose to companies with billion-dollar compute budgets, and start competing on the surface and the trust layer, you give yourself a real opportunity to win. That's the exact ground where a small team can be the best in the world at one thing.</p><p>The economics flip too. The default mode of AI software right now is "usage costs you money." This is the opposite. A user who leans on their agent harder makes their provider money, not you poorer. Your costs sit flat near zero whether someone opens the app once a year or every single day.</p><p>It's not for everything. Someone without an agent just gets a very well-made offline app; no worse off, just no magic. This is a pattern for apps whose users increasingly walk around with an assistant already in their pocket, holding data that deserves a permanent home instead of a chat log that scrolls away.</p><h2>I'm not the only one seeing this</h2><p>Straight up, I didn't coin this. "Bring your own agent" is already a phrase people are reaching for, mostly on the enterprise side. Luke Turner <a href="https://blog.luketurner.org/posts/bring-your-own-agent/">made the SaaS version of the case</a>: stop shipping mediocre in-app AI that competes with your users' state-of-the-art agents, and build the MCP surface that lets those agents drive your product instead. Same instinct as bring-your-own-device a decade ago, just aimed at intelligence instead of hardware.</p><p>It's got good company. Koomen's horseless-carriage piece is the same fight from the app side. And Geoffrey Litt and the Ink &amp; Switch crew have spent years on <a href="https://www.inkandswitch.com/essay/malleable-software/">malleable, local-first software</a>: tools you reshape yourself, your data living <a href="https://www.inkandswitch.com/essay/local-first/">with you instead of in someone's cloud</a>. The whole intellectual foundation this stands on.</p><h2>When will we get AgentKit?</h2><p>There&#8217;s a massive missing piece to this puzzle, and I think it's where this goes next. Because it kind of sucks to have to open a different app to do something in your app. I mean users will hate that. Today&#8217;s pattern runs agent-on-the-outside. Your assistant lives in its own app, reaches into mine over MCP, and the work lands on my phone. Useful, but the conversation and the app are still two places, which is gross.</p><p>Compare that to how every iOS app shows you a web page. Nobody builds a browser. They embed WebKit: Apple's whole browser engine, running inside a third-party app, and the host app sees only what the API hands back. It has access to passwords, saved context and everything their Safari browser can do. I expect them (and others) to run that same move on agents next.</p><p>In that world, a developer drops an encapsulated agent surface into their app. I open Tripfold and talk to Gemini right there, on a dedicated surface, in the context of the trip on screen. And it is genuinely <em>my</em> agent: the one that knows me, with its memories, its connectors, the skills it's picked up across everything else I do with it. The host app can't read that conversation. All it gets is what crosses the tunnel we pre-agreed on, which is exactly the skill and MCP surface the app published in the first place. The dependency points one way. (WebKit doesn't get to read your Safari history either. Same deal.)</p><p>Everyone at that table has a reason to want it. Developers get an assistant in-context that already knows the user, without shipping a model or eating a token bill. Users get one agent with one memory everywhere, instead of eleven amnesiac chatbots in eleven corners of eleven apps. And the agent companies might want it most of all: they are competing brutally for distribution right now, and "your agent, present inside every app you use" is distribution. WebKit made every app a browser without every developer building one. The same move makes every app agentic without every developer shipping an AI.</p><p>The skill-and-MCP surface I built for Tripfold is the tunnel half of that story. The embedded surface is the half I'd love to see an agent platform ship.</p><h2>Wait, what&#8217;s Tripfold?</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://trond.studio/tripfold" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cyxc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.png 424w, https://substackcdn.com/image/fetch/$s_!cyxc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.png 848w, https://substackcdn.com/image/fetch/$s_!cyxc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.png 1272w, https://substackcdn.com/image/fetch/$s_!cyxc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cyxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.png" width="1456" height="771" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:771,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1196751,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://trond.studio/tripfold&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://trond.ai/i/205276169?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.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_!cyxc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.png 424w, https://substackcdn.com/image/fetch/$s_!cyxc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.png 848w, https://substackcdn.com/image/fetch/$s_!cyxc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.png 1272w, https://substackcdn.com/image/fetch/$s_!cyxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7c1327f-93fa-46f1-b414-2b697ab7fcd0_2096x1110.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 href="https://trond.studio/tripfold">Tripfold</a> is the app I built using this approach. It holds your itinerary (flights, hotels, tickets with their real scannable barcodes, all the little logistics that matter when you&#8217;re standing in a train station in a country whose language you don&#8217;t speak) on your phone and stores data either offline or online, encrypted. You don&#8217;t plan the trip in the app. You tell your own agent &#8220;add two nights in Verona, here&#8217;s the confirmation email,&#8221; it assembles the entry, the MCP rules check the validity, it publishes the update to an online storage locker and in seconds it shows up on your phone with a note about where it came from.</p><p>I built the travel app for me and my family, but I&#8217;m happy to share the TestFlight build in case you want to try it. The pattern under it (the MCP, encrypted locker, and the bring-your-own-agent wiring) is the useful part, and I&#8217;m open sourcing it. I call that portion <a href="https://github.com/TrondW/tripkit">tripkit</a>. It&#8217;s one small example of how you can build an app to allow any stranger&#8217;s agent to safely construct your app&#8217;s data. Take it, change it, morph it to be your own. Point your own agent at your own problem.</p><p>And as of this week, Tripfold itself is in <a href="https://trond.studio/tripfold/testflight">public beta on TestFlight</a>. Download the <a href="https://github.com/TrondW/tripkit">tripkit</a> skills to your agent and you&#8217;ll be on your way!</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trond.ai/p/bring-your-own-agent?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/bring-your-own-agent?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/bring-your-own-agent?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p><em>I'm building one of these in the open, and the beta is live.</em> Install Tripfold from <a href="https://trond.studio/tripfold">trond.studio/tripfold</a>, point your agent at a trip, and hit reply with what breaks or what you're building next to it. I read everything.</p>]]></content:encoded></item><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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></channel></rss>