<?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[Preproduction by Redspring]]></title><description><![CDATA[Two builders writing about what works (and what doesn't) when you're making things in the age of AI.]]></description><link>https://building.redspring.xyz</link><image><url>https://substackcdn.com/image/fetch/$s_!H0tM!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55983ef2-bc6b-4275-9acb-d6d07e009255_256x256.png</url><title>Preproduction by Redspring</title><link>https://building.redspring.xyz</link></image><generator>Substack</generator><lastBuildDate>Tue, 15 Sep 2026 08:07:33 GMT</lastBuildDate><atom:link href="https://building.redspring.xyz/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Redspring Software LLC]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[redspring@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[redspring@substack.com]]></itunes:email><itunes:name><![CDATA[Loren Riesenfeld]]></itunes:name></itunes:owner><itunes:author><![CDATA[Loren Riesenfeld]]></itunes:author><googleplay:owner><![CDATA[redspring@substack.com]]></googleplay:owner><googleplay:email><![CDATA[redspring@substack.com]]></googleplay:email><googleplay:author><![CDATA[Loren Riesenfeld]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[From 5.52 Seconds to 0.44: Building a Streaming Voice System Around a Diffusion Model]]></title><description><![CDATA[We started with four ordinary OpenAI calls and ended with a low-cost hybrid stack that begins speaking in under a second.]]></description><link>https://building.redspring.xyz/p/from-552-seconds-to-044-building</link><guid isPermaLink="false">https://building.redspring.xyz/p/from-552-seconds-to-044-building</guid><dc:creator><![CDATA[Obssa Bizuwork]]></dc:creator><pubDate>Thu, 10 Sep 2026 23:58:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xHpu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We recently helped a founder implement a voice-to-voice system. The first version followed the path most engineers would probably start with:</p><ol><li><p>Record the person speaking.</p></li><li><p>Upload the recording and wait for a transcript.</p></li><li><p>Send the transcript to a language model and wait for its complete answer.</p></li><li><p>Send that answer to a speech model, wait for an audio file, then play it.</p></li></ol><p>It worked, but it was also quiet for around 5.5 seconds after the person stopped speaking. That felt way too long.</p><p>Today&#8217;s version starts playing audio in 444 milliseconds on the same recording. It uses <strong><a href="https://huggingface.co/kyutai/stt-1b-en_fr-candle">Kyutai STT</a></strong> and <strong><a href="https://huggingface.co/kyutai/pocket-tts">Pocket TTS</a></strong> on an L4 GPU rented by the second from <strong><a href="https://modal.com/">Modal</a></strong>. The language model is hosted <strong><a href="https://celeris.ai/celeris-1">Celeris-1</a></strong>.</p><p>Celeris-1 is a diffusion language model, which is the unusual part of the stack. Ordinary language models write an answer one small piece after another. Celeris starts with a rough answer and refines several pieces together. Short replies can appear almost at once, which is particularly useful when another model still has to turn them into speech.</p><p>The two stacks were:</p><ul><li><p><strong>First pass:</strong> <a href="https://developers.openai.com/api/docs/models/gpt-transcribe">GPT-Transcribe</a> &#8594; <a href="https://developers.openai.com/api/docs/models/gpt-5.6-terra">GPT-5.6 Terra</a> &#8594; <a href="https://developers.openai.com/api/docs/models/gpt-4o-mini-tts">GPT-4o Mini TTS</a>.</p></li><li><p><strong>Final:</strong> <a href="https://huggingface.co/kyutai/stt-2.6b-en">Kyutai STT</a> &#8594; <a href="https://celeris.ai/celeris-1">Celeris-1</a> &#8594; <a href="https://huggingface.co/kyutai/pocket-tts">Pocket TTS</a>, with the two speech models sharing one Modal L4.</p></li></ul><p>The final system is hybrid: open-weight speech models on rented hardware, with a hosted diffusion model in the middle.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xHpu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xHpu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png 424w, https://substackcdn.com/image/fetch/$s_!xHpu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png 848w, https://substackcdn.com/image/fetch/$s_!xHpu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png 1272w, https://substackcdn.com/image/fetch/$s_!xHpu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xHpu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png" width="1456" height="431" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:431,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78638,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.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_!xHpu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png 424w, https://substackcdn.com/image/fetch/$s_!xHpu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png 848w, https://substackcdn.com/image/fetch/$s_!xHpu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png 1272w, https://substackcdn.com/image/fetch/$s_!xHpu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2b5e36-e2be-4341-ad3c-61b8c5028abc_2268x672.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>What we&#8217;re measuring</strong></h2><p>Our goal is to reduce the time to first audio. In our experiments, every run uses the same 1.393-second recording of &#8220;How far away is the moon?&#8221; as the input. We measure the time from the end of that recording to the first bytes of sound the system returns. In our original stack, that means we wait until the complete MP3 arrives. In the streaming path, we only wait until the first raw audio chunks arrive.</p><p>The 5.52-second and 444-millisecond numbers compare the first version to the last one. Between those versions the models and architectures changed. To measure what each change actually contributed, we swapped one thing at a time and everything else was fixed.</p><h2>Where we started</h2><p>The first implementation uses OpenAI directly for every model stage. GPT-Transcribe receives the complete WAV. Terra receives the complete transcript. GPT-4o Mini TTS, using the Marin voice, receives the complete answer and returns one MP3. Only then does the application decode the file.</p><p>Here is the median Terra turn:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LsHe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LsHe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png 424w, https://substackcdn.com/image/fetch/$s_!LsHe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png 848w, https://substackcdn.com/image/fetch/$s_!LsHe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png 1272w, https://substackcdn.com/image/fetch/$s_!LsHe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LsHe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png" width="966" height="438" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:438,&quot;width&quot;:966,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70390,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.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_!LsHe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png 424w, https://substackcdn.com/image/fetch/$s_!LsHe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png 848w, https://substackcdn.com/image/fetch/$s_!LsHe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png 1272w, https://substackcdn.com/image/fetch/$s_!LsHe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdbf1015-63e8-41dd-b63c-6f8191a98ed9_966x438.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Speech generation was the largest source of delay. The 40-word answer ended up being about 20 seconds of audio, and the application wouldn&#8217;t play any of it until the whole file was ready.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EJiw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EJiw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png 424w, https://substackcdn.com/image/fetch/$s_!EJiw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png 848w, https://substackcdn.com/image/fetch/$s_!EJiw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png 1272w, https://substackcdn.com/image/fetch/$s_!EJiw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EJiw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png" width="1456" height="229" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:229,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41988,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.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_!EJiw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png 424w, https://substackcdn.com/image/fetch/$s_!EJiw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png 848w, https://substackcdn.com/image/fetch/$s_!EJiw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png 1272w, https://substackcdn.com/image/fetch/$s_!EJiw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e9e8ad8-d992-4867-8b63-fcdda19d1fac_2268x356.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>The first optimization: switch to Luna</strong></h2><p>For the very first optimization, we suggested switching from Terra to GPT-5.6 Luna. Everything else stayed the same.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5_Al!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5_Al!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png 424w, https://substackcdn.com/image/fetch/$s_!5_Al!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png 848w, https://substackcdn.com/image/fetch/$s_!5_Al!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png 1272w, https://substackcdn.com/image/fetch/$s_!5_Al!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5_Al!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png" width="1100" height="328" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e6012f3-e923-4890-879b-151ff802dced_1100x328.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:328,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:56871,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.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_!5_Al!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png 424w, https://substackcdn.com/image/fetch/$s_!5_Al!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png 848w, https://substackcdn.com/image/fetch/$s_!5_Al!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png 1272w, https://substackcdn.com/image/fetch/$s_!5_Al!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e6012f3-e923-4890-879b-151ff802dced_1100x328.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Luna helped, but the user still had to wait over five seconds to get a reply. The language model was only one part of a sequence in which every step waited for the previous one to finish.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Id4K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Id4K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png 424w, https://substackcdn.com/image/fetch/$s_!Id4K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png 848w, https://substackcdn.com/image/fetch/$s_!Id4K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png 1272w, https://substackcdn.com/image/fetch/$s_!Id4K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Id4K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png" width="1456" height="344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:344,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67053,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.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_!Id4K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png 424w, https://substackcdn.com/image/fetch/$s_!Id4K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png 848w, https://substackcdn.com/image/fetch/$s_!Id4K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png 1272w, https://substackcdn.com/image/fetch/$s_!Id4K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cca001-508f-47a8-b0fc-03b999ad3f83_2268x536.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>The second optimization: stream transcription</strong></h2><p>Our second angle of attack was transcription. Instead of waiting for the user to finish speaking before we began transcribing, we could stream it as they talked.</p><p>This led to our second model change: replacing GPT-Transcribe with Kyutai STT, self-hosted on a Modal GPU. We needed this swap for streaming to work at all: the live, partial-transcript flow this stack needs runs over a WebSocket, which Kyutai slots into nicely.</p><p>Blocking on the whole recording took 3,498ms. Streaming the input while it was recorded brought that to 3,181ms. Nearly 2 seconds and 37.5% faster than our previous best.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GLeM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GLeM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png 424w, https://substackcdn.com/image/fetch/$s_!GLeM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png 848w, https://substackcdn.com/image/fetch/$s_!GLeM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!GLeM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GLeM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png" width="1456" height="437" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:437,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:89326,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.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_!GLeM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png 424w, https://substackcdn.com/image/fetch/$s_!GLeM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png 848w, https://substackcdn.com/image/fetch/$s_!GLeM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!GLeM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5279f7-1261-4a27-a599-e582f2d03cde_2000x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>The third optimization: stream audio out</strong></h2><p>The same idea that helped on the way in helped again on the way out: instead of blocking audio output on a complete audio file, we stream the audio as it&#8217;s generated.</p><p>This required another model swap. We replaced GPT-4o Mini TTS with Pocket TTS, because Pocket TTS can emit raw, uncompressed audio in small chunks as it generates them rather than only returning a complete MP3 file once the entire input is processed.</p><p>Waiting for the whole audio file took 3,181ms. Streaming the audio out as raw chunks brought that to 1,778ms: 1,403ms faster, or 44%.</p><p>However long the upstream model takes to finish its reply, the pipeline no longer has to wait for a complete audio file to be synthesized from it afterward.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IBFT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IBFT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png 424w, https://substackcdn.com/image/fetch/$s_!IBFT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png 848w, https://substackcdn.com/image/fetch/$s_!IBFT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png 1272w, https://substackcdn.com/image/fetch/$s_!IBFT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IBFT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png" width="1456" height="422" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:422,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86135,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.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_!IBFT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png 424w, https://substackcdn.com/image/fetch/$s_!IBFT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png 848w, https://substackcdn.com/image/fetch/$s_!IBFT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png 1272w, https://substackcdn.com/image/fetch/$s_!IBFT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9769b56-9c6a-4f5b-9175-6beb5fbf9b7b_2000x580.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>The fourth optimization: try a diffusion model</strong></h2><p>At this point, we&#8217;d done all the obvious things. What was still glaring at us was the Luna latency. We&#8217;d heard about recent promising developments around diffusion models for text generation. Our research led us to <a href="https://celeris.ai/">Celeris</a>, who claim their <a href="https://celeris.ai/celeris-1">Celeris-1</a> model is &#8220;the fastest LLM on Earth&#8221; outputting a shocking (if true!) 2,000 tokens per second.</p><p>So we swapped Luna for Celeris-1 on the streaming stack and measured it end to end. Streaming with Luna still in place took 1,778ms. Swapping in Celeris-1 brought that down to 441ms. 75% faster.</p><p>In our own tests, Celeris-1 produced replies at a rate of roughly 400 tokens per second, not quite the 2,000 we were promised, but still at least 9 times faster than Luna by the same measure. To be fair- we didn&#8217;t run anything approaching a real benchmark here; this is just output tokens divided by wall-clock time and includes overhead.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4b5y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4b5y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png 424w, https://substackcdn.com/image/fetch/$s_!4b5y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png 848w, https://substackcdn.com/image/fetch/$s_!4b5y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png 1272w, https://substackcdn.com/image/fetch/$s_!4b5y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4b5y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png" width="1456" height="451" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:451,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66382,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.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_!4b5y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png 424w, https://substackcdn.com/image/fetch/$s_!4b5y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png 848w, https://substackcdn.com/image/fetch/$s_!4b5y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png 1272w, https://substackcdn.com/image/fetch/$s_!4b5y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f5ba9fc-41ee-4c20-afd4-88c75add3a46_2000x620.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Open-weight moves the cost; it does not erase it</strong></h2><p>Kyutai STT and Pocket TTS do not carry a per-token model charge themselves, but the GPU running them certainly costs money. And the Celeris-1 diffusion model is a paid hosted API.</p><p>Using the published pricing for these providers (<strong><a href="https://developers.openai.com/api/docs/pricing">OpenAI</a></strong>, <strong><a href="https://modal.com/pricing">Modal&#8217;s L4</a></strong>, <strong><a href="https://celeris.ai/pricing">Celeris</a></strong>), representative turns work out as follows:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P7mB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P7mB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png 424w, https://substackcdn.com/image/fetch/$s_!P7mB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png 848w, https://substackcdn.com/image/fetch/$s_!P7mB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png 1272w, https://substackcdn.com/image/fetch/$s_!P7mB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P7mB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png" width="1270" height="370" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:370,&quot;width&quot;:1270,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70011,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.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_!P7mB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png 424w, https://substackcdn.com/image/fetch/$s_!P7mB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png 848w, https://substackcdn.com/image/fetch/$s_!P7mB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png 1272w, https://substackcdn.com/image/fetch/$s_!P7mB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cd4b064-4234-484f-8e80-dbc2950a97d3_1270x370.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For the OpenAI rows, we used the measured clip duration and language-model token counts, then replayed the five saved replies through GPT-4o Mini TTS with usage reporting. The median speech charge alone was about $0.0061 with Terra&#8217;s replies and $0.0063 with Luna&#8217;s. That is why the much cheaper language model had only a modest effect on the complete turn.</p><p>For the hybrid row, we measured from the first microphone frame through the final spoken chunk. The warm turn occupied a median of 6.08 seconds of wall time. At $0.000222 per L4-second, that is $0.00135 of equivalent GPU time. Celeris adds roughly $0.00004 for a short prompt and reply.</p><h2><strong>The complete progression</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_!h5n_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h5n_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png 424w, https://substackcdn.com/image/fetch/$s_!h5n_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png 848w, https://substackcdn.com/image/fetch/$s_!h5n_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png 1272w, https://substackcdn.com/image/fetch/$s_!h5n_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h5n_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png" width="1328" height="492" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:492,&quot;width&quot;:1328,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111280,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.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_!h5n_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png 424w, https://substackcdn.com/image/fetch/$s_!h5n_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png 848w, https://substackcdn.com/image/fetch/$s_!h5n_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png 1272w, https://substackcdn.com/image/fetch/$s_!h5n_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f5a8e5-9974-4cd3-a995-b82d08074720_1328x492.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ezn4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ezn4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png 424w, https://substackcdn.com/image/fetch/$s_!ezn4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png 848w, https://substackcdn.com/image/fetch/$s_!ezn4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png 1272w, https://substackcdn.com/image/fetch/$s_!ezn4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ezn4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png" width="1456" height="239" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:239,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96636,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.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_!ezn4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png 424w, https://substackcdn.com/image/fetch/$s_!ezn4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png 848w, https://substackcdn.com/image/fetch/$s_!ezn4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png 1272w, https://substackcdn.com/image/fetch/$s_!ezn4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1573d3a7-b323-491e-b177-bb83e3cde762_2800x460.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The first implementation was not badly written. It was a reasonable composition of good APIs. Its latency came from the boundaries between them: complete recording, complete transcript, complete answer, and finally complete audio file.</p><p>The final implementation is much faster because it moves partial results forward. It transcribes during the question, starts speech from the first useful sentence, and plays raw audio while it the rest is still being generated. The stack also changed to fit that shape: Kyutai and Pocket TTS share a rented GPU, while Celeris supplies fast hosted text generation.</p><p><strong>The results?</strong></p><p>Milliseconds saved: <strong>5,080</strong>.</p><p>Waiting time reduced: <strong>92%</strong>.</p><p>Not having to ask &#8220;Are you still there?&#8221; <em><strong>Priceless</strong></em>.</p><p>You can try the replay at <a href="https://seconds.redspring.workers.dev">seconds.redspring.workers.dev</a>, built from 13 questions recorded once against both stacks. The reproducible first-pass script, exact WAV, raw measurements, cost ledger, and diagram sources are in the repository: <a href="https://github.com/redspringxyz/seconds">https://github.com/redspringxyz/seconds</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xpNJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xpNJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png 424w, https://substackcdn.com/image/fetch/$s_!xpNJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png 848w, https://substackcdn.com/image/fetch/$s_!xpNJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png 1272w, https://substackcdn.com/image/fetch/$s_!xpNJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xpNJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png" width="1456" height="431" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:431,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75336,&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://building.redspring.xyz/i/215136754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.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_!xpNJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png 424w, https://substackcdn.com/image/fetch/$s_!xpNJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png 848w, https://substackcdn.com/image/fetch/$s_!xpNJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png 1272w, https://substackcdn.com/image/fetch/$s_!xpNJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d17ce84-b5db-492d-84db-ce44ba794e76_2268x672.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Appendix: cold starts</strong></h2><p>The Modal service scales to zero between visits. A cold L4 wake takes about 28 seconds. Blending that into warm-turn medians would muddy the measurements, so the interface reports cold startup on its own.</p>]]></content:encoded></item><item><title><![CDATA[We built a focus app and tested loop engineering in the process]]></title><description><![CDATA[Recently, Loren got back from a ten-day silent meditation retreat with a fire under him about changing his relationship with the internet.]]></description><link>https://building.redspring.xyz/p/we-built-a-focus-app-and-tested-loop</link><guid isPermaLink="false">https://building.redspring.xyz/p/we-built-a-focus-app-and-tested-loop</guid><dc:creator><![CDATA[Loren Riesenfeld]]></dc:creator><pubDate>Wed, 26 Aug 2026 13:43:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_vrT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently, Loren got back from a ten-day silent meditation retreat with a fire under him about changing his relationship with the internet. A big piece of that was wanting to break the default habit of opening news sites or Reddit in the thirty seconds between finishing one task and starting another. The retreat made him realize he wanted to be more intentional about the media and information he was consuming, rather than doing it on autopilot.</p><p>There are already some tools for this, like Freedom and Cold Turkey, and Brick for your phone. But all the desktop ones had unnecessary features like cross-device sync, scheduling, browser extensions, and dashboards. We only wanted one thing: block a list of websites for a set amount of time, with no way to undo it until the time runs out. This was simple enough that we thought we should just build it ourselves.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://building.redspring.xyz/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Preproduction by Redspring! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The app is called Retreat. It&#8217;s free, open source, and works on macOS 15 or later. You can download it at <a href="https://retreat.computer/">retreat.computer</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://retreat.computer" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_vrT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png 424w, https://substackcdn.com/image/fetch/$s_!_vrT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png 848w, https://substackcdn.com/image/fetch/$s_!_vrT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png 1272w, https://substackcdn.com/image/fetch/$s_!_vrT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_vrT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png" width="1456" height="1138" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1138,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:203526,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://retreat.computer&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://building.redspring.xyz/i/212542698?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.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_!_vrT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png 424w, https://substackcdn.com/image/fetch/$s_!_vrT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png 848w, https://substackcdn.com/image/fetch/$s_!_vrT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png 1272w, https://substackcdn.com/image/fetch/$s_!_vrT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd21b3aa5-2645-49ae-8475-479b532413eb_1640x1282.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Diving into loop engineering</h2><p>Building Retreat was also an experiment. We&#8217;ve been thinking about <a href="https://addyosmani.com/blog/loop-engineering/">loop engineering</a>, where you give an agent a high-level goal, let it generate its own subtasks, execute them, and iterate until the goal is achieved. Ideally, the process is largely unattended and you come back to finished software.</p><p>We&#8217;ve seen loop engineering work in a few specific contexts. There&#8217;s <a href="https://bun.com/blog/bun-in-rust#loops-that-write-review-code">a much-discussed case</a> of the JavaScript runtime Bun migrating an enormous codebase from Zig to Rust largely through autonomous agent loops. That&#8217;s the kind of task loop engineering is probably suited for: a clear input, a clear output, a test suite that can verify correctness without human eyes.</p><p>We wanted to see how it would hold up for building a new native app from scratch. The short answer is that it didn&#8217;t, really.</p><h2>Agentic tech bureaucracy</h2><p>We let the agents run for around twenty-four hours, using frontier models and a setup where they&#8217;d generate tasks for themselves, execute them, and loop. The agents wrote code and features, and something resembling Retreat took shape.</p><p>But when we came back to it, the agents had created a system of elaborate and incomprehensible internal tickets, an agentic tech bureaucracy. Reading through what the agents had decided mattered and why, was like reading meeting notes from a company that didn&#8217;t exist (for good reason).</p><p>Also, a lot of the code didn&#8217;t work.</p><p>The core problem is that loop engineering needs verifiable success criteria that the agent can check <em>without</em> a human in the loop. For a library or framework with unit tests, that works pretty well. For a native macOS app that blocks network requests, the agent doesn&#8217;t have a good enough way to verify that the blocking actually works. Computer use has gotten better, but isn&#8217;t fully solved yet.</p><p>On top of that, building any product involves hundreds of small decisions. Every time the agent made one differently than we would have, the gap between what the agents were creating and the result we wanted would grow. After enough of these branching decisions, the product goes in an entirely different direction.</p><p>Eventually we ended up doing what we always do: sitting down with the agents, being hands-on, guiding the code, testing manually, and fixing things. And now, the app is what we want it to be, but it definitely wasn&#8217;t loop engineering that got it there.</p><h2>The future of loop engineering?</h2><p>Loop engineering is probably the right choice, in the right conditions. If you have clear success criteria, verifiable outputs, and well-defined scope like migrating a codebase, running a batch job, or transforming data in a predictable way, loop engineering could save you a lot of work.</p><p>But new product development isn&#8217;t the right fit yet. Products involve taste and nuanced decisions, and often, involve you changing your mind about the result. The agents can handle a lot, but they can&#8217;t handle all that.</p><p>The tooling also isn&#8217;t there yet for native app development specifically. Agents can more or less run the app with computer use, but it&#8217;s still flawed and burns tons of tokens, which leaves a huge gap in development. You still need to do the most important part yourself.</p><p>We&#8217;ll keep experimenting, but for now, Retreat was built the old new way: we had an idea, some agents helped write the code, and we did a lot of manual iteration.</p><p>Download it at <a href="https://retreat.computer">retreat.computer</a>. Source is on GitHub. Time to break out of bad habits!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://building.redspring.xyz/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Preproduction by Redspring! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Write Your Evals Before You Write Your Product]]></title><description><![CDATA[How a non-technical founder can define and measure&#8221;good&#8221; before a single line of code is written.]]></description><link>https://building.redspring.xyz/p/write-your-evals-before-you-write</link><guid isPermaLink="false">https://building.redspring.xyz/p/write-your-evals-before-you-write</guid><dc:creator><![CDATA[Obssa Bizuwork]]></dc:creator><pubDate>Mon, 17 Aug 2026 16:40:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gUL6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>How a non-technical founder can define and measure&#8221;good&#8221; before a single line of code is written.</em></p><p>If you&#8217;re planning an AI product, there&#8217;s a piece of work you can do right now, before you hire an engineer or open a code editor, that will save you months of wandering: write your evals.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://building.redspring.xyz/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Preproduction by Redspring! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>An eval is just a repeatable test for an AI system. You give it an input, it produces an output, and something &#8212; a rule, a rubric, or another model &#8212; judges whether the output is good. Simple, and doable for non-engineers. There&#8217;s a growing consensus among AI product leaders that evals are the key spec for AI products, rather than product requirement documents (PRDs). Traditional PRDs lean on words like &#8220;helpful,&#8221; &#8220;accurate,&#8221; and &#8220;concise,&#8221; which can&#8217;t really be tested. AI systems are probabilistic, meaning the same input can produce different outputs, and models change under your feet. An eval collapses the spec, the acceptance criteria, and the launch review into one runnable artifact that answers a single question: <em>what does good look like, and how do I measure it?</em></p><p>One key benefit is that you don&#8217;t need an actual product to write evals. All you need is judgment about your domain. And if you&#8217;re the founder, you have more of that than anyone you&#8217;ll ever hire.</p><h2>Step 1: Write down 20 real inputs</h2><p>Every eval has three ingredients: a <strong>dataset</strong> (example inputs), a <strong>task</strong> (the AI doing the work), and <strong>scorers</strong> (how you judge the output). You can build the dataset and the scorers before you even have a product.</p><p>Before anything else, build the dataset. Write out twenty to thirty examples of what users will actually ask your product to do. Make them as natural as possible, based on language your target customers would use in real life. For instance, if you&#8217;re building a tool that summarizes legal contracts, go find twenty contracts. If the product is a customer support agent, write out twenty support tickets (make sure to include some &#8220;unhappy customer&#8221; ones and some &#8220;I don&#8217;t know what I actually need&#8221; ones).</p><h2>Step 2: Define what good looks like in binary</h2><p>Next, for each input you created, write what a great output would contain. Then turn your quality bar into yes or no questions. A few great examples: Did it cite the actual clause? Did it stay under 150 words? Did it avoid inventing numbers? Did it escalate when the customer mentioned a refund?</p><p>We&#8217;re often tempted to score things on a 1&#8211;10 scale, but resist that &#8212; it won&#8217;t be helpful in the long run. Pass or fail is hard enough, and it forces you to be brutally honest about your requirements. Most importantly, make the criteria fully yours. Avoid generic metrics and make your scorers specific to your product. High quality looks different for every product.</p><h2>Step 3: Grade by hand first</h2><p>Next, run your inputs through an AI model (Claude, ChatGPT, or whatever you use most often) using a rough prompt that describes what your product should do. Grade each output yourself: thumbs up or down, and include one sentence explaining <em>why</em> it was good or bad. That written justification is incredibly valuable: it becomes your failure taxonomy (&#8221;made up a policy,&#8221; &#8220;buried the answer,&#8221; or &#8220;wrong tone for a complaint&#8221;) and each failure mode becomes a scorer later on.</p><p>This stage is sometimes called vibe-checking. Don&#8217;t skip it. <em>Never</em> automate a judgment you haven&#8217;t first made yourself, repeatedly, on real examples. A spreadsheet with your labels is a completely legitimate eval system.</p><h2>Step 4: Make it repeatable with Braintrust</h2><p>Once your hand-graded spreadsheet exists, a tool like <a href="https://www.braintrust.dev/">Braintrust</a> turns it into something you can run over and over without writing code. You can paste your inputs and expected outputs into its dataset editor, write your prompt in the browser-based playground, and run it against the whole dataset at once, comparing prompts and models side by side. Its AI assistant, Loop, will even draft scorers from a plain-English description (&#8221;check that the summary never invents a dollar figure&#8221;). You describe your bar for quality in a sentence or two, then Loop will write the grading logic, and then you can verify if the logic agrees with your hand labels before using it. There&#8217;s a free tier, and the whole workflow is usable by a non-engineer. (Langfuse is a strong open-source alternative.)</p><p>Now, without hiring an engineer, you can change the prompt, rerun the eval, and <em>know</em> whether it got better.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gUL6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gUL6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png 424w, https://substackcdn.com/image/fetch/$s_!gUL6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png 848w, https://substackcdn.com/image/fetch/$s_!gUL6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!gUL6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gUL6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:422950,&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://building.redspring.xyz/i/211584742?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.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_!gUL6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png 424w, https://substackcdn.com/image/fetch/$s_!gUL6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png 848w, https://substackcdn.com/image/fetch/$s_!gUL6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png 1272w, https://substackcdn.com/image/fetch/$s_!gUL6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77c80320-16d8-433f-9e45-c2c3bdc4a379_2998x1714.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Human review queue</figcaption></figure></div><h2>Evals build a strong foundation</h2><p>By the time you engage engineers, whether that&#8217;s a technical co-founder or a team like ours, you&#8217;ll be able to hand them a runnable definition of success instead of a prose wishlist. They can test three models against your dataset in an afternoon and tell you which one clears your bar (and what it costs). Every future change will get measured against the same benchmark, so improvements build on each other.</p><p>There are two warnings before you dive in. First, don&#8217;t get set on a perfect pass rate. If <em>everything</em> passes, your eval is too easy, and you&#8217;re optimizing for your own comfort rather than quality. Second, don&#8217;t let perfectionism stall you: an imperfect set of twenty examples you can come up with in a week beats &#8220;perfect&#8221; dataset that takes months to be designed by a committee. Once your product launches, real user data will reshape the dataset anyway. Production failures quickly become new test cases, and the eval will grow with the product.</p><p>There&#8217;s no secret access to better AI models. Everyone has the same ones. The secret to success is defining &#8220;good&#8221; outputs precisely and early on &#8212; and using those benchmarks going forward. You can start that today. All you need is a spreadsheet.</p><div><hr></div><p><em>Redspring is a boutique AI and software consultancy in New York. Your founding engineering team, on demand. If you&#8217;ve got a dataset and a dream, we&#8217;d love to talk.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://building.redspring.xyz/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Preproduction by Redspring! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Narrative Games in the Age of AI]]></title><description><![CDATA[What we learned building a murder mystery with Lemony Snicket]]></description><link>https://building.redspring.xyz/p/narrative-games-in-the-age-of-ai</link><guid isPermaLink="false">https://building.redspring.xyz/p/narrative-games-in-the-age-of-ai</guid><dc:creator><![CDATA[Loren Riesenfeld]]></dc:creator><pubDate>Thu, 23 Jul 2026 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3752a2b8-656b-4e0d-9953-9bf173bcb80f_2522x1658.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>What we learned building a murder mystery with Lemony Snicket</h2><p>For most of human history, there was a stark line between audience and story. The audience heard the story, read the book, and eventually watched the movie. The story happened while you observed.</p><p>Interactive storytelling changed that. There were choose-your-own-adventure books (remember those?), then RPG and narrative games. Now, AI is changing things again.</p><p>This week, The Atlantic released an <a href="https://www.theatlantic.com/games/lemony-snicket-suspicious-incident-dubious-park/">interactive murder mystery</a> co-developed by Redspring, written by Lemony Snicket and illustrated by Michael Kupperman. Players step into the role of detective in a closed park, talk to a cast of eccentric characters, and try to figure out who committed the murder. The characters are powered by AI, but the story architecture is still human.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://www.theatlantic.com/games/lemony-snicket-suspicious-incident-dubious-park/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WiCG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp 424w, https://substackcdn.com/image/fetch/$s_!WiCG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp 848w, https://substackcdn.com/image/fetch/$s_!WiCG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp 1272w, https://substackcdn.com/image/fetch/$s_!WiCG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WiCG!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp" width="1200" height="788.8977002379064" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:1658,&quot;width&quot;:2522,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The scene of the crime in Dubious Park: a park full of suspects, from the Zookeeper at the Reptile House to Detective Aiden deCamp standing over the victim&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://www.theatlantic.com/games/lemony-snicket-suspicious-incident-dubious-park/&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="The scene of the crime in Dubious Park: a park full of suspects, from the Zookeeper at the Reptile House to Detective Aiden deCamp standing over the victim" title="The scene of the crime in Dubious Park: a park full of suspects, from the Zookeeper at the Reptile House to Detective Aiden deCamp standing over the victim" srcset="https://substackcdn.com/image/fetch/$s_!WiCG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp 424w, https://substackcdn.com/image/fetch/$s_!WiCG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp 848w, https://substackcdn.com/image/fetch/$s_!WiCG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp 1272w, https://substackcdn.com/image/fetch/$s_!WiCG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf35222f-ec65-4bcd-baf0-599e534f5b27_2522x1658.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Dubious Park, illustrated by Michael Kupperman</p><p>We sat down with <a href="https://www.linkedin.com/in/caleb-madison-89198853/">Caleb Madison</a>, former director of games at The Atlantic and the person who originally conceived of the project, to talk about what we learned over the last year building a human-authored game with characters you can interrogate in real time.</p><h2>The problem of authority</h2><p>Caleb has been making games since he was fourteen, mostly crosswords. To him, the appeal is simple: games create a bounded arena with a final, true answer (something we don&#8217;t often find in the real world). A game designer leads a player towards a certain outcome, ideally in a dynamic and entertaining way.</p><p>We were all captivated by the idea of bringing AI into that world. Can we use this new medium as a way to tell stories that you can engage with, that feel surprising, and that pique your curiosity because they evolve?</p><p>That idea runs directly into a fundamental challenge of AI today: uncertainty.</p><p>In a traditional story, the author is the source of truth. If the novel says it was a dark and stormy night, the reader accepts it. But in an AI-mediated experience, where you discover the story through conversation, who is speaking with authority? The author? The system? The character? The model?</p><p>This became our central design problem. The original concept had psychologically layered suspects who could be caught in lies. It was an Agatha Christie-style cross-examination where players would triangulate the truth by finding contradictions. Caleb described why that didn&#8217;t work: &#8220;If this one thing is a lie, then how many other things are lies? It becomes a hall of mirrors.&#8221;</p><p>Lemony Snicket, it turned out, understood this intuitively. His creative instincts pushed the game away from forensic interrogation and toward something more expansive. We were soon building an oddball ensemble in a fully realized world, where the characters had distinct personas and the players were fully inhabiting the space.</p><p>Lemony helped us realize that the solution was to give the characters a strong enough identity that players trust them even when they surprise you.</p><h2>Building the game</h2><p>Early in the project, we developed a character builder that let an author train a character through dialogue, refining its persona until it feels consistent. It was a good idea, but it wasn&#8217;t quite right for this project.</p><p>Working with a writer like Lemony Snicket, who already had a rich and specific creative universe, the character builder felt stifling. Instead, the best approach was to give him room to define the characters in longhand, in his own voice, with his own instincts. Our job became translating those authored characters into personas that could hold up inside an interactive system.</p><p>That required a lot of testing. We put the game in front of as many people as we could, watched their conversations, and learned which paths worked and which led nowhere. Coordinating characters, world knowledge, player knowledge, and the investigatory path toward the solution were all refined through that process until the experience felt natural.</p><p>Players never see most of what makes the game work, and that&#8217;s part of what makes it a success. The fact that it feels simple is a big achievement. Underneath that simplicity is a system that we iterated on for months.</p><h2>AI is just one wire in the sculpture</h2><p>The question Caleb gets asked most about this project is some version of: isn&#8217;t AI just a way to cut corners? His answer, in this case, is definitely not.</p><blockquote><p>&#8220;I see creative work and its relationship to tools or the medium of creativity as pretty consistent, whether it&#8217;s oil paint, film, or the computer. The amount of work that the creative person, or the people on the back end, put into the thing is directly proportional to how good it is. There&#8217;s no hack or way of getting around that.</p><p>We didn&#8217;t use AI as a shortcut for creativity here. Our desire, our curiosity, was to figure out how to integrate AI and LLMs thoughtfully into a larger storytelling experience.</p><p>This game would not be fun without Lemony&#8217;s story, which he put so much work and effort into; without Michael Kupperman&#8217;s beautiful illustrations; and without the hours and hours of collaborative work that all of us have done to fit this together in a way that feels satisfying.</p><p>My sense is that a game, in many ways, is like a big, complex digital sculpture. AI is like a little thing hanging on one of the wires in the sculpture. It&#8217;s not the base of the sculpture at all. It&#8217;s ornamental in a way that I hope lends itself to satisfaction and play.</p><p>This is an attempt to use AI as a medium in and of itself: as a material integrated into other creative materials, the visual arts and the storytelling arts, to be one part of the mosaic of the expression of a story and an experience.&#8221;</p></blockquote><h2>AI &#8800; creativity</h2><p>Towards the end of our conversation, Caleb voiced the most useful thing we took away from this project: making AI art means chiseling away at a vast space of possibility.</p><p>AI can generate almost anything. Creativity comes in when deciding what AI <strong>won&#8217;t</strong> do in a specific context. For the game, it was what persona a character holds to, what knowledge it has access to, and what the boundaries of the world are. We found that the more precisely we defined those constraints, the more the experience felt authored rather than generated.</p><p>The principle of constraining AI applies beyond games. Any time you build something with AI at its center, the quality of the output is determined by the choices you make about what the model is and isn&#8217;t allowed to do. Your choices as the system architect are the creative center of the output.</p><h2>A peek into a bigger room</h2><p>In the gaming world, we&#8217;re still in the early stages of AI integration. Caleb compared the current moment to the Lumi&#232;re brothers projecting footage of a train arriving at a station: audiences ran because they didn&#8217;t yet understand the boundaries of the medium. (Probably an <a href="https://www.atlasobscura.com/articles/did-a-silent-film-about-a-train-really-cause-audiences-to-stampede">urban legend</a>, but the comparison stands). Today, audiences and users are still figuring out where AI ends and where the human begins. That confusion is going to take time to resolve, and that&#8217;s why we&#8217;re continuing to experiment.</p><p>Building this game left us with a set of better questions. What does authorship mean when a reader can interrogate the characters? What does truth mean in a story where the player discovers it through conversation? What does constraint mean when the system could, in theory, say almost anything?</p><p>We don&#8217;t have tidy answers to any of those. But we know how to ask the questions more precisely than we did before. That feels like the right place to be when a medium is this young. We&#8217;ll be watching this space closely. As Caleb said, &#8220;I&#8217;m very fascinated by interactive storytelling, puzzles, games, storytelling proper, the classic storytelling of the 20th century and previous eras, and the intersection of all of them in the beautiful intermedia future that we are all barreling toward at breakneck speeds.&#8221;</p><p><em><a href="https://www.theatlantic.com/games/lemony-snicket-suspicious-incident-dubious-park/">Lemony Snicket&#8217;s Suspicious Incident in Dubious Park</a></em> is live. Go solve a murder!</p>]]></content:encoded></item><item><title><![CDATA[OCR’ing 100,000 pages with open-source VLMs on Modal]]></title><description><![CDATA[We wanted to answer a simple question: what does it actually take to OCR a large document corpus using open-source vision-language models?]]></description><link>https://building.redspring.xyz/p/vlm-ocr-bench</link><guid isPermaLink="false">https://building.redspring.xyz/p/vlm-ocr-bench</guid><dc:creator><![CDATA[Loren Riesenfeld]]></dc:creator><pubDate>Thu, 25 Jun 2026 08:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a11b23dc-1a38-4931-bb0f-63a230cf2a07_2986x1722.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We wanted to answer a simple question: what does it actually take to OCR a large document corpus using open-source vision-language models?</p><p>We picked a workload of 100,000 pages. That number was mostly arbitrary, but it was large enough to be interesting, and large enough that we had to figure out how to make it not a financially ruinous endeavor.</p><p><strong>tl;dr - three things that surprised us:</strong></p><ol><li><p><strong>Self-hosting open-source OCR is cheaper and far less painful than you might think.</strong> Our full 100k-page run with <code>dots.ocr-1.5</code> finished in 56.5 minutes for $223 &#8212; about $2.27 per 1,000 pages. Staging weights, renting GPUs, and standing up the serving stack took hours, not days; <a href="https://modal.com">Modal</a> did most of the heavy lifting, and we never touched a CUDA driver or a container registry.</p></li><li><p><strong>The cheapest GPU per second may be the slowest to finish and unacceptable at scale.</strong> An <code>L4</code> can land in the same dollars-per-page band as an <code>H100</code> while taking 5&#8211;6&#215; longer to drain the queue. Cost-per-page doesn&#8217;t matter if you blow your SLA.</p></li><li><p><strong>Benchmark your workload, not the leaderboard.</strong> Two public-ranking favorites lost once we measured them on the shape of <em>our</em> data.</p></li></ol><p>This post is for engineers, technical founders, and anyone who has mostly lived on hosted APIs from the big model providers and wants a concrete sense of what self-hosting actually looks like in practice.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://redspringxyz.github.io/ocr-results-viewer/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XQJp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png 424w, https://substackcdn.com/image/fetch/$s_!XQJp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png 848w, https://substackcdn.com/image/fetch/$s_!XQJp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png 1272w, https://substackcdn.com/image/fetch/$s_!XQJp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XQJp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The OCR results viewer showing a rendered source page next to OCR output from chandra-ocr-2, dots-ocr-1.5, nemotron, and nemotron-fp8, with per-model latency and token counts.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://redspringxyz.github.io/ocr-results-viewer/&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The OCR results viewer showing a rendered source page next to OCR output from chandra-ocr-2, dots-ocr-1.5, nemotron, and nemotron-fp8, with per-model latency and token counts." title="The OCR results viewer showing a rendered source page next to OCR output from chandra-ocr-2, dots-ocr-1.5, nemotron, and nemotron-fp8, with per-model latency and token counts." srcset="https://substackcdn.com/image/fetch/$s_!XQJp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png 424w, https://substackcdn.com/image/fetch/$s_!XQJp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png 848w, https://substackcdn.com/image/fetch/$s_!XQJp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png 1272w, https://substackcdn.com/image/fetch/$s_!XQJp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f477a01-240e-44f3-a2e1-631224624d3a_2986x1722.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Side-by-side viewer to compare every model's OCR output against the rendered original. <a href="https://redspringxyz.github.io/ocr-results-viewer/">Check it out &#8594;</a></figcaption></figure></div><h3>Why open-source models?</h3><p>Control, cost, and quality that is <em>good enough</em> for the vast majority of document workflows. We focused on VLMs (rather than text-only OCR) because real documents are messy: handwritten forms, scanned PDFs, awkward multi-column layouts, and text baked into images all break naive text extraction.</p><p>Running your own model turns a fixed price sheet into a set of knobs. The weights, serving engine, batch strategy, GPU type, and quantization are all yours to tune. You stop paying a per-token markup and start paying for GPU-seconds, which flips the economics once volume is non-trivial.</p><p>There&#8217;s a strategic angle too, and it&#8217;s the one that&#8217;s easy to underweight until it bites you. If a hosted API is the foundation of your product, you don&#8217;t own the cost curve, the model lifecycle, or the deployment path. Prices move, default models change underneath you, and the exact model you tuned around can be deprecated on the vendor&#8217;s schedule, not yours. Self-hosting trades convenience for control over the variables that matter in production.</p><h3>The three axes that matter</h3><p>Everything below comes back to three measurements:</p><ul><li><p><strong>Throughput</strong> &#8212; pages per second per GPU. Sets wall-clock time and how many GPUs you need.</p></li><li><p><strong>Cost</strong> &#8212; dollars per page. Sets whether the project is viable at scale.</p></li><li><p><strong>Quality</strong> &#8212; does the model actually read the page right? A page OCR&#8217;d cheaply is worthless if it silently garbles the text. We treat this qualitatively (more on why in <a href="#model-selection">Model Selection</a>) and ship a viewer so you can check our work.</p></li></ul><p>We&#8217;ll take them roughly in the order they mattered to us: <em>which</em> model, then <em>how fast and how cheap</em>, then <em>how close to correct</em>, and finally how all of that stacks up against the proprietary APIs.</p><h2>Who we are</h2><p>We&#8217;re the founders of <a href="https://redspring.xyz">Redspring</a>, an AI and product-development consultancy. We build applied ML systems, including large-scale document and data processing, so this was equal parts client-relevant and an excuse to satisfy our own curiosity.</p><h2>Overview</h2><ol><li><p>Model and engine selection</p></li><li><p>Modal basics</p></li><li><p>Benchmark methodology</p></li><li><p>Results</p></li><li><p>What we learned</p></li><li><p>Conclusion</p></li></ol><h2>Model Selection</h2><p>We picked models based largely on how they performed on OCR-oriented public benchmarks, including <a href="https://huggingface.co/datasets/allenai/olmOCR-bench">olmOCR-bench</a>, <a href="https://99franklin.github.io/ocrbench_v2/">OCRBench v2</a>, and the OCR-related leaderboards collected by LLM-Stats (<a href="https://llm-stats.com/benchmarks/omnidocbench-1.5">OmniDocBench 1.5</a>, <a href="https://llm-stats.com/benchmarks/ocrbench">OCRBench</a>). Because these benchmarks cover different tasks and not every model appears on every leaderboard, we treated them as directional rather than definitive.</p><p>Here&#8217;s the rough ranking we used to decide what to test:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!35uA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!35uA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png 424w, https://substackcdn.com/image/fetch/$s_!35uA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png 848w, https://substackcdn.com/image/fetch/$s_!35uA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png 1272w, https://substackcdn.com/image/fetch/$s_!35uA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!35uA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png" width="1456" height="746" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:746,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96662,&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://redspring.substack.com/i/208673088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.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_!35uA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png 424w, https://substackcdn.com/image/fetch/$s_!35uA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png 848w, https://substackcdn.com/image/fetch/$s_!35uA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png 1272w, https://substackcdn.com/image/fetch/$s_!35uA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71dd2e3-4833-4a44-a0fa-e49489b2f2bf_1484x760.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is not meant to be a universal ranking. It ignores cost, latency, serving complexity, and the specifics of the workload. It was just a sensible starting point.</p><h3>Why we didn&#8217;t compute a single accuracy number</h3><p>The obvious move here is to report CER/WER against ground truth and crown a winner. We deliberately didn&#8217;t, for two reasons. First, that work already exists and is done well &#8212; the public benchmarks above are the right place for a rigorous, apples-to-apples score, and we&#8217;d only be reproducing them worse. Second, a single aggregate number hides exactly the failures that matter in production. A model can post an excellent average CER while occasionally and <em>confidently</em> rewriting a clause, and a quiet hallucination is far more dangerous downstream than uniformly fuzzy text.</p><p>So we used the public benchmarks to <em>pick candidates</em>, then judged the shortlist the way you&#8217;d actually judge it before shipping: by reading the output. We built a side-by-side viewer (<em>last section of this post</em>) and spent real time in it. The verdict and per-model recommendations live there, next to the evidence. If quality is mission-critical for your workload, do the same &#8212; pull a representative sample, run it through your top 2&#8211;3 candidates, and have someone who knows the domain eyeball the results.</p><h2>Modal basics</h2><p><a href="https://modal.com">Modal</a> is a good fit for this work because it makes GPU-backed serving much less painful than doing the same thing on AWS/GCP/Azure from scratch. On a hyperscaler, serving a single GPU-backed model typically means: picking a GPU instance family with the right capacity and availability, wrestling CUDA drivers into the base image, wiring up autoscaling and cold-start handling, standing up a container registry, piping in secrets via IAM or a parameter store, and mounting some kind of network volume so you aren&#8217;t re-downloading 50+ GB of weights on every boot. Each of those is a half-day task in its own right, and most of them are about cloud plumbing rather than the model you actually want to serve.</p><p>Modal collapses most of that into a single Python file. The basic pattern is simple:</p><ul><li><p>stage model weights into a persistent Volume</p></li><li><p>mount that Volume into a GPU-backed container</p></li><li><p>start the serving engine during container startup</p></li><li><p>expose the service over a normal HTTP interface</p></li></ul><p>For batch-style setup work, like downloading Hugging Face weights into durable storage, we used one-off functions. For serving, we used a GPU-backed class that launched the engine as a subprocess during startup and exposed a web server once the container was ready.</p><p>Here&#8217;s the rough shape:</p><pre><code>volume = modal.Volume.from_name("dots-ocr-1.5-assets", create_if_missing=True)

@app.function(
    image=image,
    secrets=[modal.Secret.from_name("hf-secret")],
    volumes={"/models": volume},
)
def upload_model_to_volume() -&gt; None:
    snapshot_download(..., local_dir="/models/dots.ocr-1.5")
    volume.commit()</code></pre><p>And for a long-lived service:</p><pre><code>@app.cls(
    image=vllm_image,
    gpu="L4",
    volumes={"/models": model_volume, "/root/.cache/vllm": vllm_cache_volume},
    scaledown_window=300,
    min_containers=0,
)
class DotsOcrVLLM:
    @modal.enter()
    def startup(self) -&gt; None:
        self.process = subprocess.Popen(["vllm", "serve", ...])

    @modal.web_server(8000, startup_timeout=900, label="dots-ocr-1-5-vllm")
    def serve(self) -&gt; None:
        pass</code></pre><p>A few details mattered. Each of these corresponds to a platform primitive that, if it didn&#8217;t exist, you&#8217;d have to build yourself on a generic cloud:</p><p><strong>Volumes.</strong> A Modal Volume is a persistent, mountable filesystem shared across functions and containers. Model weights for a VLM run 20&#8211;200+ GB; downloading them on every container start would blow the cold-start budget and rack up egress from model stores like Hugging Face. Staging weights into a Volume once and mounting it read-only at runtime means each new container sees the weights as local disk in a fraction of a second.</p><p><strong>Secrets.</strong> Modal Secrets are named, server-side key-value bundles you reference by name and inject as environment variables at runtime. We used them for things like <code>HF_TOKEN</code> so credentials never landed in the image, the repo, or local shell history. Rotating a secret is a single CLI call; no rebuild required.</p><p><strong>Scaling controls.</strong> <code>min_containers</code>, <code>max_containers</code>, and <code>scaledown_window</code> let you trade idle cost against cold starts &#8212; a warm container eats GPU-time until it scales down, a cold one pays the model-load penalty on the next request. For benchmarking we set <code>max_containers=1</code> so the system would stay on a single container rather than auto-scaling to absorb our synthetic load, which would have made throughput measurements unreadable. We also usually killed containers right after a run to avoid paying for idle time. In production, the same two knobs let you pre-warm for SLA-sensitive traffic or go fully scale-to-zero for batch windows.</p><p>That&#8217;s enough infrastructure to make the experiments reproducible without turning this post into a deployment manual.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9AjZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9AjZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png 424w, https://substackcdn.com/image/fetch/$s_!9AjZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png 848w, https://substackcdn.com/image/fetch/$s_!9AjZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png 1272w, https://substackcdn.com/image/fetch/$s_!9AjZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9AjZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Modal Apps dashboard showing the deployed OCR inference endpoints &#8212; chandra-ocr-2, nemotron-fp8, nemotron-vl, glm-ocr, and dots-ocr-1.5 &#8212; each with its GPU type and web endpoint.&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="Modal Apps dashboard showing the deployed OCR inference endpoints &#8212; chandra-ocr-2, nemotron-fp8, nemotron-vl, glm-ocr, and dots-ocr-1.5 &#8212; each with its GPU type and web endpoint." title="Modal Apps dashboard showing the deployed OCR inference endpoints &#8212; chandra-ocr-2, nemotron-fp8, nemotron-vl, glm-ocr, and dots-ocr-1.5 &#8212; each with its GPU type and web endpoint." srcset="https://substackcdn.com/image/fetch/$s_!9AjZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png 424w, https://substackcdn.com/image/fetch/$s_!9AjZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png 848w, https://substackcdn.com/image/fetch/$s_!9AjZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png 1272w, https://substackcdn.com/image/fetch/$s_!9AjZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b7d3a0-7662-4b9e-9ee9-c894cd619384_2984x1836.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Each model became its own Modal app exposed over a web endpoint and pinned to the GPU type we were sweeping.</figcaption></figure></div><h2>Benchmark Methodology</h2><p>The basic idea was straightforward: load a corpus of PDFs, send one OCR request per page until the sample run is complete, and measure throughput under different concurrency levels. Combined with measured pages-per-second-per-GPU and Modal&#8217;s on-demand pricing, that gave us a reasonable way to estimate cost and fleet size for a 100,000-page run before we accidentally emptied our bank accounts.</p><p>Concretely, we:</p><ul><li><p>ran the same models across multiple GPU types</p></li><li><p>swept through concurrency levels to determine max GPU throughput</p></li><li><p>evaluated the results quantitatively (speed, cost) and qualitatively (output fidelity)</p></li></ul><p>One important setup detail: we pre-rasterized the PDF pages into images as a cheap one-off job before the main OCR benchmarks. That kept the benchmark focused on the part we actually cared about &#8212; model serving throughput and GPU cost &#8212; rather than letting PDF rendering dominate or add noise to the measurements. In a real production pipeline, you would still need to account for rendering, storage, and orchestration, but those costs are much smaller and easier to optimize than GPU-backed model inference.</p><p>We did <strong>not</strong> run <em>every</em> model/configuration as a literal 100,000-page end-to-end job. Instead, we used representative benchmark samples and combined the measured throughput with public pricing to estimate full-run cost. For planning and comparison, that was good enough. As we got closer to the final run, we moved from single-container spot checks to multi-container <code>H100</code> runs of 5,000&#8211;20,000 pages so the extrapolation would reflect production fleet behavior rather than individual GPU performance. After those multi-container H100 runs gave us a configuration we trusted, we ran the full 100,000-page job with that setup.</p><h2>Results</h2><p>The rest of this section walks through these three axes in order: <strong>quality</strong> (is the output any good?), <strong>throughput and cost</strong> (can we afford it at scale?), and <strong>proprietary-API comparison</strong> (is it worth self-hosting at all?).</p><h3>Assessing quality: the side-by-side viewer</h3><p>Before any of the cost numbers mean anything, you have to answer the obvious question: does this model actually read the page right? So we built a small static viewer that lets you flip through individual pages and compare every model&#8217;s OCR output against the rendered original, side-by-side. Best on desktop.</p><p><a href="https://redspringxyz.github.io/ocr-results-viewer/">Open the OCR Results Viewer in a new tab &#8594;</a></p><p><strong>Our verdict after spending real time in the viewer:</strong></p><ul><li><p><strong>Reach for Chandra when fidelity is paramount.</strong> It&#8217;s our top pick on accuracy, and the lead is most visible on tables and complex formatting where the others start dropping cells or mangling structure. Good fit for compliance-sensitive documents, archive digitization, or anything downstream that assumes the text is trustworthy.</p></li><li><p><strong>Reach for <code>dots.ocr-1.5</code> when throughput or cost is the binding constraint.</strong> It&#8217;s a very close second on quality and a runaway winner on cost-per-page &#8212; the right call when the downstream consumer is another model (RAG indexing, classification, summarization, agentic workflows) that can absorb a little OCR noise.</p></li></ul><p>Both are genuinely strong; the pick is about which axis you&#8217;re optimizing. And don&#8217;t sleep on the Qwen variants in the viewer &#8212; they weren&#8217;t purpose-built for OCR and still hold up better than we expected. The viewer exists precisely so you don&#8217;t have to take our verdict, the public leaderboards, or the cost tables below on faith.</p><h3>Self-hosted cost to process 100k pages</h3><p>The headline run used a fleet of <strong>60 H100s</strong> handling 200 concurrent requests. It submitted 100,056 pages, completed 98,159, and sustained 28.96 submitted pages/s &#8212; finishing in <strong>56.5 minutes</strong> at <strong>$223.10</strong> of measured GPU cost. Normalized over successful pages, that&#8217;s <strong>$2.27 per 1,000 pages</strong>, at a failure rate just under 2%.</p><p>We didn&#8217;t jump straight to 60 GPUs. Before committing to the full job, we ran a few smaller multi-container <code>H100</code> sweeps with <code>dots.ocr-1.5</code> to establish a throughput-and-cost baseline we trusted enough to extrapolate 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_!UJ5o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UJ5o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png 424w, https://substackcdn.com/image/fetch/$s_!UJ5o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png 848w, https://substackcdn.com/image/fetch/$s_!UJ5o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png 1272w, https://substackcdn.com/image/fetch/$s_!UJ5o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UJ5o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png" width="1456" height="378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:378,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:63766,&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://redspring.substack.com/i/208673088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.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_!UJ5o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png 424w, https://substackcdn.com/image/fetch/$s_!UJ5o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png 848w, https://substackcdn.com/image/fetch/$s_!UJ5o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png 1272w, https://substackcdn.com/image/fetch/$s_!UJ5o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5a0e2-9004-4aae-ae9b-046933c5c9e7_1626x422.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The next table is a compact view of model x GPU sweeps. It does not list every concurrency setting we tested; instead, it normalizes each run down to the best per-GPU throughput and the estimated <code>100K</code>-page cost that mattered for choosing the final profile.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RrqL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RrqL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png 424w, https://substackcdn.com/image/fetch/$s_!RrqL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png 848w, https://substackcdn.com/image/fetch/$s_!RrqL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png 1272w, https://substackcdn.com/image/fetch/$s_!RrqL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RrqL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png" width="1456" height="717" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:717,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:148272,&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://redspring.substack.com/i/208673088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.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_!RrqL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png 424w, https://substackcdn.com/image/fetch/$s_!RrqL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png 848w, https://substackcdn.com/image/fetch/$s_!RrqL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png 1272w, https://substackcdn.com/image/fetch/$s_!RrqL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14e020f4-0a12-41a8-bf7e-b9ba1b54a0c3_1588x782.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These estimates used <strong>Modal&#8217;s pricing</strong> at the time of publishing and the formula:</p><p><strong>Estimated run cost formula:</strong></p><p> run cost &#8776; (pages&nbsp;/&nbsp;throughput) &#215; GPU_count &#215; GPU_price_per_sec</p><p><em>Where "throughput" is measured in pages/sec/GPU.</em></p><p>Pricing assumptions used here:</p><ul><li><p><code>L4 = $0.000222/s</code></p></li><li><p><code>L40S = $0.000542/s</code></p></li><li><p><code>A100</code> (40GB) <code>= $0.000583/s</code></p></li><li><p><code>A100-80GB = $0.000694/s</code></p></li><li><p><code>H100 = $0.001097/s</code></p></li><li><p><code>H200 = $0.001261/s</code></p></li><li><p><code>B200 = $0.001736/s</code></p></li></ul><h3>Proprietary API price-sheet comparison</h3><p>We include proprietary API pricing as context, not as an argument for the APIs. The thing worth scrutinizing isn&#8217;t the per-page number; it&#8217;s the dependency you take on when one vendor owns both the model and the price sheet.</p><p>The shape of the comparison is a vise. The frontier models that match or beat our open-source picks on quality &#8212; Claude Opus 4.8, GPT-5.5 &#8212; cost roughly $4,000 and $6,000 for the same 100k-page run, 18&#8211;27&#215; our self-hosted cost. The proprietary models that get close to our cost, like <code>gpt-5.4-nano</code> and <code>gpt-4.1-mini</code>, aren&#8217;t quality-competitive: in our review they were the ones most prone to quietly rewriting text. The example below is representative. The source sentence says researchers run registration and fusion <em>concurrently</em>; <code>gpt-5.4-nano</code> invented a different claim entirely, lifting the phrase &#8220;dynamic gradient sparsity property&#8221; from the <em>next</em> sentence and presenting it as the method. Nothing in the output signals that it&#8217;s wrong &#8212; which is exactly what makes it dangerous.</p><p><mark data-color="#b6d7a8" style="background-color: rgb(182, 215, 168); color: rgb(0, 0, 0);">&#10003; Correct</mark> (matched by <code>chandra-ocr-2</code> and <code>dots.ocr-1.5</code>)</p><p>To address the complexities of image registration task, certain researchers endeavor to <mark data-color="#b6d7a8" style="background-color: rgb(182, 215, 168); color: rgb(0, 0, 0);">execute registration and fusion processes concurrently.</mark></p><p><mark data-color="#ea9999" style="background-color: rgb(234, 153, 153); color: rgb(0, 0, 0);">&#10007; Hallucinated</mark> (<code>gpt-5.4-nano</code>)</p><p>To address the complexities of image registration task, certain researchers endeavor to <mark data-color="#ea9999" style="background-color: rgb(234, 153, 153); color: rgb(0, 0, 0);">implement a dynamic gradient sparsity property.</mark></p><p>To sanity-check the earlier token-budget estimates, we also ran a sample of our own pages through several proprietary models and recorded the provider-reported costs. Extrapolating from those observed costs, this is what the same 100,000-page workload would look like.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bLyn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bLyn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png 424w, https://substackcdn.com/image/fetch/$s_!bLyn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png 848w, https://substackcdn.com/image/fetch/$s_!bLyn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png 1272w, https://substackcdn.com/image/fetch/$s_!bLyn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bLyn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png" width="1456" height="1406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1406,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:191217,&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://redspring.substack.com/i/208673088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.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_!bLyn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png 424w, https://substackcdn.com/image/fetch/$s_!bLyn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png 848w, https://substackcdn.com/image/fetch/$s_!bLyn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png 1272w, https://substackcdn.com/image/fetch/$s_!bLyn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d6d90d0-80f5-429d-a3a5-16580f7173c2_1502x1450.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Two things to take away from the table. First, read it by quality tier, not by price: the cheap rows ($120&#8211;$510) are <em>not</em> substitutes for <code>dots.ocr-1.5</code> or Chandra, because they&#8217;re the ones that hallucinate. Second, once you filter to genuinely comparable quality, the proprietary cost sits an order of magnitude or more above our $223 self-hosted run. Batch APIs can narrow that gap for jobs you&#8217;re willing to defer, but a batch endpoint is a different product the moment you need predictable sub-hour completion.</p><h3>What the API comparison misses</h3><p>The broad takeaway is simpler than a head-to-head matrix: self-hosted VLMs on Modal are often competitive on run cost for comparable-quality OCR, and the dollar figure is the least of it. With the propietary APIs, the cheaper model you built around can get more expensive or retired out from under you. Self-hosting trades that exposure for stronger guarantees and choices <em>you</em> can make around:</p><ul><li><p><strong>The deployment knobs.</strong> You choose the model, GPU, engine, concurrency, batching strategy, and fleet size. With an API, the highest-leverage knobs belong to the vendor.</p></li><li><p><strong>The deadline trade-off.</strong> Finishing faster is a visible capacity decision: add GPUs, pick a different GPU class, tune the server. With APIs, sub-hour throughput depends on account tiers, rate limits, and provider capacity.</p></li><li><p><strong>Where the data goes.</strong> For OCR workloads, the input is often the sensitive part. Running in your own Modal account changes the privacy and compliance conversation.</p></li></ul><p>If OCR is becoming core infrastructure for your product or business, owning the serving path matters.</p><h2>What we learned</h2><h3>1. Benchmark your workload, not somebody else&#8217;s</h3><p>It&#8217;s tempting to read a leaderboard, take the top row, and move on. Sometimes that&#8217;s right. Sometimes it&#8217;s exactly wrong &#8212; two of our public-ranking favorites lost once we measured them on our own pages.</p><p>What actually decides the winner is the shape of <em>your</em> workload: document type, token mix, output length, preprocessing path, concurrency, and the precise quality threshold you need. OCR is a particularly nasty case because it pairs heavy image inputs with long text outputs, so a model that&#8217;s fast on chat-style traffic can fall over here. The leaderboard tells you who to test; your own pages tell you who to ship.</p><h3>2. GPU price and SLA have to be evaluated together</h3><p>On paper, an <code>L4</code> or <code>L40S</code> is far cheaper per second than an <code>H100</code>. In practice that&#8217;s a trap, because per-second price and time-to-finish trade off against each other. Our measured <code>dots.ocr-1.5</code> rows make it concrete: the <code>L4</code> landed in roughly the same <em>cost-per-page</em> band as the <code>H100</code> while running ~5&#8211;6&#215; slower. So the cheap GPU buys you nothing on cost and costs you a one-to-two-hour job turning into an overnight one. The right pick is a function of your deadline: a loose SLA makes a low-end GPU perfectly sensible, a tight one justifies the H100 even at a higher sticker price. We chose H100s for the final run on that basis &#8212; best cost/time trade-off, not cheapest line item.</p><h3>3. Quantization is worth taking seriously</h3><p>We started out mildly skeptical that FP8 would hold quality without leaving performance on the table. The data didn&#8217;t support the skepticism. The clearest case from the later sweeps is <code>Nemotron</code>, holding everything else constant:</p><ul><li><p><strong>BF16</strong> on <code>H100</code>: ~0.10 pages/s, ~$1,100 per 100k pages.</p></li><li><p><strong>FP8</strong> on <code>H100</code>: ~0.17 pages/s, ~$650 per 100k pages.</p></li></ul><p>That&#8217;s a ~70% throughput gain and a ~40% cost cut from a single knob. It wasn&#8217;t enough to make Nemotron beat <code>dots.ocr-1.5</code> for this workload, but that&#8217;s the narrow point. The broad one is that quantization is a real, near-free lever on both throughput and cost, and it belongs in the production search space rather than the &#8220;maybe later&#8221; pile.</p><h2>Conclusion</h2><p>We went in curious about two things: how good open-source OCR VLMs have actually gotten, and how much effort it really takes to run them at scale. The answers turned out to be &#8220;very&#8221; and &#8220;less than we expected.&#8221; 100,000 pages, 56 minutes, $223, on infrastructure we stood up in an afternoon.</p><p>Hosted APIs are the right default for prototypes and one-off product work, and we&#8217;ll keep using them there. But &#8220;default&#8221; isn&#8217;t the same as &#8220;neutral.&#8221; The moment you care about throughput, cost control, batch windows, data residency, or tuning the system around a specific workload, the calculus shifts toward owning the serving path. Self-hosting isn&#8217;t always the cheapest line on a price sheet, but for comparable-quality OCR at volume it was both cheaper <em>and</em> more controllable &#8212; and the operational know-how you build along the way is itself a moat that compounds.</p><p>That&#8217;s the part we&#8217;d underline for anyone weighing this: owning the model layer gives you direct control over the variables that decide whether something works in production &#8212; performance, cost, quality, and predictability &#8212; instead of renting them from a vendor whose incentives aren&#8217;t yours.</p><p>And we don&#8217;t think $223 is the floor. Newer serving engines, more aggressive quantization, and more careful tuning all point downward from here. We&#8217;ll keep tracking the state of the art; our guess is there&#8217;s still meaningful headroom left.</p><p>Useful references:</p><ul><li><p><a href="https://modal.com/llm-almanac/how-to-benchmark">Modal&#8217;s benchmarking guide</a></p></li><li><p><a href="https://github.com/vllm-project/guidellm">guidellm</a></p></li><li><p><a href="https://modal.com/pricing">Modal&#8217;s Pricing page</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[We Benchmarked Frontier Reasoning Models on The Atlantic's Bracket City]]></title><description><![CDATA[I&#8217;ve been obsessed with The Atlantic&#8217;s new word game, Bracket City.]]></description><link>https://building.redspring.xyz/p/bracket-city-bench</link><guid isPermaLink="false">https://building.redspring.xyz/p/bracket-city-bench</guid><dc:creator><![CDATA[Loren Riesenfeld]]></dc:creator><pubDate>Tue, 15 Jul 2025 12:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gIvu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been obsessed with The Atlantic&#8217;s new word game, Bracket City. It&#8217;s a puzzle where clues hide inside nested brackets. You start with something like <code>[["___ of Arabia"] who starred in "[monosyllabic Michael [capital of Mississippi] album] Boys"]</code> and work your way inward&#8212;first solving &#8221;___ of Arabia&#8221; (Lawrence) and &#8220;capital of Mississippi&#8221; (Jackson), revealing <code>[Lawrence who starred in [monosyllabic Michael Jackson album] Boys]</code>. Each solved clue unlocks new brackets until you reveal a final statement.</p><p>I&#8217;m ashamed to admit that when I get stuck, I&#8217;ll paste a screenshot into ChatGPT o3 and ask for help. It&#8217;s freakishly good. At one point, I noticed in the chain of thought that o3 often tries to reason through the entire puzzle. So I got curious: I started pasting screenshots of completely unsolved puzzles and asking o3 to work through the whole thing. Often, it would nail the solution perfectly.</p><p>That&#8217;s when it hit me: if these models can solve complex word puzzles, how do they actually compare? Which ones excel at this kind of deep, recursive reasoning?</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;0dd556ae-dec6-448d-8ff1-2f1dc5491080&quot;,&quot;duration&quot;:null}"></div><p><em>Claude 4 Opus solving a recent Bracket City puzzle</em></p><h2>Building the Benchmark</h2><p>My first approach seemed obvious: feed screenshots to each model and see who wins.</p><p>It worked okay, but the inference endpoints timed out constantly. Models would get halfway through reasoning and just&#8230; stop. Even when they didn&#8217;t timeout, the visual parsing was inconsistent&#8212;some models would misread brackets or lose track of nested structures entirely.</p><p>The breakthrough came when I reimplemented Bracket City&#8217;s game logic as LLM tool calls:</p><pre><code>const tools = {
  makeGuess: {
    description: "Make a guess for a specific bracket clue",
    parameters: {
      clue: "The clue text inside brackets (without the brackets)",
      guess: "Your guess for the answer to this clue",
    },
  },

  getHint: {
    description: "Get a hint (first letter) for a difficult clue",
    parameters: {
      clue: "The clue text inside brackets (without the brackets)",
    },
  },

  revealClue: {
    description: "Reveal the full answer for a clue (last resort)",
    parameters: {
      clue: "The clue text inside brackets (without the brackets)",
    },
  },
};</code></pre><p>This approach worked beautifully. Models could now interact with puzzles programmatically, maintaining state while focusing purely on the reasoning challenge. I gave each model up to 50 steps to solve a puzzle, with the same scoring rules as human players: start at 100 points, lose 2 for wrong guesses, 5 for hints, and 15 for reveals.</p><p>The system prompt emphasized working from the innermost brackets outward&#8212;a key strategy for solving these puzzles efficiently. Models that understood this recursive pattern performed significantly better.</p><h2>The Results</h2><p>I tested 16 frontier models across 20 different Bracket City puzzles. The results revealed a fascinating tradeoff between accuracy and efficiency:</p><p><strong>The Top Scorer: o3-high</strong></p><ul><li><p>Average score: 92.11/100</p></li><li><p>Success rate: 100%</p></li><li><p>Average time per puzzle: <strong>11 minutes</strong></p></li></ul><p><strong>The Efficiency Champion: Claude 4 Opus</strong></p><ul><li><p>Average score: 88.9/100</p></li><li><p>Success rate: 100%</p></li><li><p>Average time per puzzle: <strong>3 minutes</strong></p></li></ul><p>While o3-high technically won with the highest score, it came at a steep cost&#8212;taking nearly 4x longer than Claude 4 Opus to achieve only marginally better results. This raises a crucial question: is a 3.2% improvement in accuracy worth quadrupling your inference time?</p><p>Here&#8217;s the complete leaderboard:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gIvu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gIvu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png 424w, https://substackcdn.com/image/fetch/$s_!gIvu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png 848w, https://substackcdn.com/image/fetch/$s_!gIvu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png 1272w, https://substackcdn.com/image/fetch/$s_!gIvu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gIvu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png" width="1456" height="1607" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1607,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:266820,&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://redspring.substack.com/i/208673089?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.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_!gIvu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png 424w, https://substackcdn.com/image/fetch/$s_!gIvu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png 848w, https://substackcdn.com/image/fetch/$s_!gIvu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png 1272w, https://substackcdn.com/image/fetch/$s_!gIvu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3003977-0b4f-4d76-aed8-1937726c3e86_1662x1834.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The most shocking results come from the bottom of the table. OpenAI&#8217;s &#8220;reasoning-optimized&#8221; mini models are disasters&#8212;o3-mini spent an absurd 27 minutes per puzzle to achieve a pathetic 39.13 average score. That&#8217;s nearly 9x longer than Claude 4 Opus for less than half the performance. Meanwhile, humble GPT-4.1 managed a respectable 45.75 score in just 33 seconds.</p><h2>The Time-Performance Paradox</h2><p>The benchmark reveals a critical insight about modern AI systems: more thinking time doesn&#8217;t necessarily mean better thinking. Look at these striking comparisons:</p><ul><li><p><strong>Gemini 2.5 Pro (06-05)</strong> scored 70.3 but took nearly 20 minutes per puzzle</p></li><li><p><strong>Gemini 2.5 Pro (05-06)</strong> scored 62.8 but finished in just 1 minute</p></li><li><p><strong>o3-mini (high)</strong> spent 27 minutes thinking to score worse than GPT-4.1&#8217;s 33-second performance</p></li></ul><p>This suggests that many models are stuck in inefficient reasoning loops rather than making meaningful progress. Claude&#8217;s models consistently demonstrate the best balance&#8212;they think efficiently, exploring productive paths rather than spinning their wheels.</p><h2>Why This Matters</h2><p>For real-world applications, the time-performance tradeoff is crucial. Consider these scenarios:</p><ul><li><p><strong>Customer support</strong>: Would you rather wait 11 minutes for a 92% accurate response or 3 minutes for an 89% accurate one?</p></li><li><p><strong>Code debugging</strong>: Is a slightly better bug fix worth 4x the debugging time?</p></li><li><p><strong>Research assistance</strong>: Do you need the absolute best answer, or the best answer you can get in a reasonable timeframe?</p></li></ul><p>In most cases, Claude 4 Opus represents the sweet spot&#8212;near-peak performance at practical speeds. The 3.2% accuracy gap between it and o3-high is negligible for most use cases, but the time difference is substantial.</p><h2>The Surprising Winners and Losers</h2><p><strong>Winners:</strong></p><ul><li><p><strong>Claude models</strong> dominated the top spots with consistent speed and accuracy</p></li><li><p><strong>Grok-4</strong> (86.15 score, 5.2 min) showed X&#8217;s model can compete with the best</p></li><li><p><strong>GPT-4.1</strong> delivered respectable performance at lightning speed</p></li></ul><p><strong>Losers:</strong></p><ul><li><p><strong>o3-mini and o4-mini</strong> are embarrassments&#8212;slow AND inaccurate</p></li><li><p><strong>Gemini 2.5 Pro (06-05)</strong> took 20 minutes for middling results</p></li><li><p><strong>Qwen3-235b</strong> spent 25 minutes per puzzle for the worst performance</p></li></ul><p>The failure of OpenAI&#8217;s mini models is particularly damning. These were supposedly optimized for reasoning tasks, yet they performed worse than general-purpose models while taking 30-50x longer. It&#8217;s a cautionary tale about the dangers of optimizing for the wrong metrics.</p><h2>The Real Lesson</h2><p>This benchmark teaches us that in AI, as in life, perfection is often the enemy of good. o3-high&#8217;s marginal victory comes at such a steep time cost that it&#8217;s rarely the right choice for practical applications. Claude 4 Opus emerges as the real winner&#8212;fast enough for interactive use, accurate enough for serious work.</p><p>The results also expose the hollowness of some &#8220;reasoning-optimized&#8221; claims. True reasoning capability isn&#8217;t about thinking longer&#8212;it&#8217;s about thinking better. Claude&#8217;s models demonstrate this perfectly, efficiently navigating solution spaces while others get lost in computational dead ends.</p><p>For developers building AI products, the message is clear: optimize for the full user experience, not just benchmark scores. A slightly less accurate model that responds in seconds will create more value than a marginally better one that makes users wait.</p><p>Want to test your own models or see the full results? The benchmark code is available at [<a href="https://github.com/redspringxyz/bracket-city-benchmark">github.com/redspringxyz/bracket-city-benchmark</a>].</p>]]></content:encoded></item></channel></rss>