<?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[saral’s Substack]]></title><description><![CDATA[My personal Substack]]></description><link>https://shodhan.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!WftI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8681913e-0d4a-4541-bb97-4e247257ccf2_2048x1365.jpeg</url><title>saral’s Substack</title><link>https://shodhan.substack.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 20 Jul 2026 21:17:56 GMT</lastBuildDate><atom:link href="https://shodhan.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[saral shodhan]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[shodhan@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[shodhan@substack.com]]></itunes:email><itunes:name><![CDATA[motivatedpanda]]></itunes:name></itunes:owner><itunes:author><![CDATA[motivatedpanda]]></itunes:author><googleplay:owner><![CDATA[shodhan@substack.com]]></googleplay:owner><googleplay:email><![CDATA[shodhan@substack.com]]></googleplay:email><googleplay:author><![CDATA[motivatedpanda]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Long Division Without Tears: A Visual Walkthrough]]></title><description><![CDATA[Long division is often one of the first places confident young math learners get stuck. Visual models can make the process feel less abstract&#8212;and help children understand what each step is actually do]]></description><link>https://shodhan.substack.com/p/long-division-without-tears-a-visual</link><guid isPermaLink="false">https://shodhan.substack.com/p/long-division-without-tears-a-visual</guid><dc:creator><![CDATA[motivatedpanda]]></dc:creator><pubDate>Sun, 19 Jul 2026 02:00:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MKzb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you have a 4th or 5th grader, you may recognize the moment when math homework stops being a quick worksheet and starts becoming a source of frustration.</p><p>For many children, that moment is long division.</p><p>A child who felt confident with multiplication is suddenly staring at a bracket, several columns of numbers, and a sequence of instructions:</p><p><strong>Divide. Multiply. Subtract. Bring down.</strong></p><p>Miss one step or place one digit in the wrong column, and the entire problem can unravel.</p><p>Before long, &#8220;I&#8217;m just bad at math&#8221; can harden into &#8220;Math isn&#8217;t for me.&#8221;</p><p>But getting stuck on long division usually does not mean a child is bad at math. It often means the symbols arrived before the underlying idea made sense.</p><p>Children do not always need the same procedure explained one more time. Sometimes, they need to <strong>see what division means</strong>.</p><h2>The Traditional Method Is Efficient&#8212;but Compressed</h2><p>The standard long-division algorithm is powerful and efficient.</p><p>But it compresses several ideas into a small amount of notation:</p><ul><li><p>How many equal groups fit?</p></li><li><p>How much has been accounted for?</p></li><li><p>How much remains?</p></li><li><p>Which place value are we working with?</p></li><li><p>Is the answer reasonable?</p></li></ul><p>For a child who already understands those relationships, the algorithm is a useful shortcut. For a child who does not, it can feel like a fragile list of rules to memorize.</p><p>That is why directions such as &#8220;subtract and bring down the next number&#8221; may not help when a child gets stuck. The child may remember the instruction without understanding why the step works.</p><p>A gentler approach is to build the meaning first, then connect that meaning to the written algorithm.</p><h2>A Visual Path Into Long Division</h2><p>In Math Magic, the <strong>Division Champions</strong> adventure, Levels 21&#8211;30, introduces division as a progression rather than a single procedure.</p><p>Children begin with equal groups, move into estimation and visual models, and gradually connect those ideas to partial quotients and standard long division.</p><p>You can use the same progression at home.</p><h2>Step 1: Begin With Equal Groups</h2><p>Before introducing the long-division bracket, return to something concrete.</p><p>Suppose the problem is:</p><p><strong>24 &#247; 4</strong></p><p>Instead of beginning with a memorized procedure, Math Magic lets the child take away complete groups of four diamonds.</p><p>In the example below, the child has already removed two groups:</p><ul><li><p>24 diamonds at the start</p></li><li><p>4 removed in the first group</p></li><li><p>4 removed in the second group</p></li><li><p>16 diamonds remaining</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MKzb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MKzb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png 424w, https://substackcdn.com/image/fetch/$s_!MKzb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png 848w, https://substackcdn.com/image/fetch/$s_!MKzb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png 1272w, https://substackcdn.com/image/fetch/$s_!MKzb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MKzb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png" width="1152" height="1302" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1302,&quot;width&quot;:1152,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:281814,&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://shodhan.substack.com/i/207609198?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.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_!MKzb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png 424w, https://substackcdn.com/image/fetch/$s_!MKzb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png 848w, https://substackcdn.com/image/fetch/$s_!MKzb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png 1272w, https://substackcdn.com/image/fetch/$s_!MKzb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b26be70-5a1c-4d10-a95a-14358870d7c9_1152x1302.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Each group is visible, and the amount remaining changes as the child works.</em></p><p>The child is not performing a mysterious operation. They are answering a visible question:</p><blockquote><p>&#8220;How many complete groups of 4 can I take from 24?&#8221;</p></blockquote><p>The activity also makes the remainder meaningful. The child stops when fewer than four diamonds remain&#8212;because there are not enough to make another complete group.</p><p>This gives division a meaning the child can return to later:</p><ul><li><p>The <strong>dividend</strong> is the full amount.</p></li><li><p>The <strong>divisor</strong> is the size of each group.</p></li><li><p>The <strong>quotient</strong> tells us how many complete groups fit.</p></li><li><p>The <strong>remainder</strong> is what is left when another complete group cannot be made.</p></li></ul><p>Once those relationships are clear, the symbols become easier to understand.</p><h2>Step 2: See Division as Repeated Subtraction</h2><p>Equal groups can also be shown on a number line.</p><p>For:</p><p><strong>34 &#247; 6</strong></p><p>the question becomes:</p><blockquote><p>&#8220;How many times can you take 6 away from 34?&#8221;</p></blockquote><p>Each backward jump represents one complete group of six.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D1B7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D1B7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png 424w, https://substackcdn.com/image/fetch/$s_!D1B7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png 848w, https://substackcdn.com/image/fetch/$s_!D1B7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png 1272w, https://substackcdn.com/image/fetch/$s_!D1B7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D1B7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png" width="495" height="665" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:665,&quot;width&quot;:495,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:229786,&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://shodhan.substack.com/i/207609198?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.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_!D1B7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png 424w, https://substackcdn.com/image/fetch/$s_!D1B7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png 848w, https://substackcdn.com/image/fetch/$s_!D1B7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png 1272w, https://substackcdn.com/image/fetch/$s_!D1B7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a6e4222-aa01-4d0b-b833-a9a711749670_495x665.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Each jump removes one group of six. The child can see both how many groups have been taken and how much remains.</em></p><p>In the example, the child has taken three jumps:</p><p><strong>34 &#8722; 6 &#8722; 6 &#8722; 6 = 16</strong></p><p>That does not mean the problem is finished. Since 16 is still large enough to take away another group of six, the child can continue.</p><p>The number line makes two parts of division visible at the same time:</p><ul><li><p><strong>Jumps taken</strong> represent the number of complete groups found so far.</p></li><li><p><strong>Amount left</strong> shows what still needs to be divided.</p></li></ul><p>The child stops only when the amount remaining is smaller than six. That final amount becomes the remainder.</p><p>Repeated subtraction helps connect the concrete equal-groups idea to later division methods:</p><blockquote><p>Making one group of six and taking away six are two ways of describing the same action.<br></p></blockquote><p>The final visual sequence should now be:</p><p><strong>Equal groups &#8594; Repeated-subtraction number line &#8594; Ballpark estimate &#8594; Area model &#8594; Standard long division &#8594; Coach Maya</strong>.</p><h2>Step 3: Find the Ballpark Before Solving</h2><p>Before calculating an exact answer, help the child decide approximately how large the answer should be.</p><p>For example:</p><p><strong>503 &#247; 7</strong></p><p>Math Magic places 503 on a number line and asks:</p><blockquote><p>&#8220;About how many 7s fit before you reach 503?&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b61C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b61C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png 424w, https://substackcdn.com/image/fetch/$s_!b61C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png 848w, https://substackcdn.com/image/fetch/$s_!b61C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png 1272w, https://substackcdn.com/image/fetch/$s_!b61C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b61C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png" width="1152" height="847" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:847,&quot;width&quot;:1152,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:288972,&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://shodhan.substack.com/i/207609198?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.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_!b61C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png 424w, https://substackcdn.com/image/fetch/$s_!b61C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png 848w, https://substackcdn.com/image/fetch/$s_!b61C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png 1272w, https://substackcdn.com/image/fetch/$s_!b61C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4662d17-d61a-4aa5-a16c-6774d770508a_1152x847.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></blockquote><p><em>The number line makes the size of 503 visible before the child starts calculating.</em></p><p>A child might reason:</p><ul><li><p>503 is close to 500.</p></li><li><p>7 &#215; 10 is 70.</p></li><li><p>7 &#215; 70 is 490.</p></li><li><p>So the answer should be somewhere around 70&#8212;not 7 and not 700.</p></li></ul><p>The goal is not to solve the entire problem yet. The goal is to establish the answer&#8217;s approximate size.</p><p>That estimate becomes a safety net.</p><p>If the child later calculates an answer of 700, they have a reason to pause and ask:</p><blockquote><p>&#8220;Does that fit the ballpark I predicted?&#8221;</p></blockquote><p>Estimation does not replace careful calculation. It helps children notice when a place-value error has pushed an answer far outside a reasonable range.</p><h2>Step 4: Build the Total With Friendly Chunks</h2><p>Next, Math Magic represents division as building a total with equal rows.</p><p>For:</p><p><strong>155 &#247; 5</strong></p><p>each row holds five. The child&#8217;s job is to determine how many rows are needed to reach 155.</p><p>Instead of adding one row at a time, the child can use friendly chunks:</p><ul><li><p><strong>+10 rows</strong> adds 50 because 10 &#215; 5 = 50.</p></li><li><p><strong>+1 row</strong> adds 5 because 1 &#215; 5 = 5.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XV_E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XV_E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png 424w, https://substackcdn.com/image/fetch/$s_!XV_E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png 848w, https://substackcdn.com/image/fetch/$s_!XV_E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png 1272w, https://substackcdn.com/image/fetch/$s_!XV_E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XV_E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png" width="1152" height="1513" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1513,&quot;width&quot;:1152,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:394290,&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://shodhan.substack.com/i/207609198?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.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_!XV_E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png 424w, https://substackcdn.com/image/fetch/$s_!XV_E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png 848w, https://substackcdn.com/image/fetch/$s_!XV_E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png 1272w, https://substackcdn.com/image/fetch/$s_!XV_E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f51b037-e8d9-4820-9534-c77bfa9c42c9_1152x1513.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>The child builds toward 155 in groups of five while a progress bar shows how much has been accounted for.</em></p><p>In the screenshot, the child has built 105 of the required 155.</p><p>The visual invites the child to ask:</p><blockquote><p>&#8220;How much more do I need?&#8221;</p></blockquote><p>The remaining amount is:</p><p><strong>155 &#8722; 105 = 50</strong></p><p>Because each group contains five:</p><p><strong>50 &#247; 5 = 10 more groups</strong></p><p>The child can reach the goal by adding one more chunk of ten rows.</p><p>This is the same reasoning behind partial quotients. Instead of trying to find the complete quotient immediately, the child finds manageable pieces and combines them.</p><h2>Step 5: Connect the Visual Back to Long Division</h2><p>The goal is not to avoid the traditional algorithm forever.</p><p>The goal is to make sure the child understands what the algorithm is recording.</p><p>With <strong>155 &#247; 5</strong>, the visual model might produce partial quotients such as:</p><ul><li><p>10 groups of 5 account for 50</p></li><li><p>another 10 groups account for another 50</p></li><li><p>another 10 groups account for another 50</p></li><li><p>1 more group accounts for 5</p></li></ul><p>Together:</p><p><strong>10 + 10 + 10 + 1 = 31</strong></p><p>So:</p><p><strong>155 &#247; 5 = 31</strong></p><p>The standard algorithm records the same reasoning in a more compact form.</p><p>Once a child understands the groups, chunks, and remaining amount, &#8220;divide, multiply, subtract, and bring down&#8221; are no longer disconnected commands. They describe actions the child has already seen:</p><ul><li><p><strong>Divide:</strong> Estimate how many groups fit.</p></li><li><p><strong>Multiply:</strong> Find how much those groups account for.</p></li><li><p><strong>Subtract:</strong> Determine what remains.</p></li><li><p><strong>Bring down:</strong> Continue the same reasoning with the next place value.</p></li></ul><p>The written method becomes a shortcut for an idea the child already understands.</p><h2>Coaching That Guides Without Taking Over</h2><p>Even with good visual tools, children will still get stuck. That is part of learning.</p><p>After a long day, however, it can be difficult for a parent to explain the same idea several different ways while keeping the conversation calm.</p><p>That is why Math Magic includes <strong>Coach Maya</strong>, an AI learning coach designed to guide children without simply completing the problem for them.</p><p>When a child works through a problem such as dividing 2,368 books into groups of 29, the visual keeps the important relationships in view:</p><ul><li><p>the total number of books,</p></li><li><p>the size of each full group,</p></li><li><p>the unknown number of groups,</p></li><li><p>and a possible leftover that is smaller than 29.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pWl6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pWl6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png 424w, https://substackcdn.com/image/fetch/$s_!pWl6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png 848w, https://substackcdn.com/image/fetch/$s_!pWl6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png 1272w, https://substackcdn.com/image/fetch/$s_!pWl6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pWl6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png" width="818" height="732" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:732,&quot;width&quot;:818,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:236438,&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://shodhan.substack.com/i/207609198?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.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_!pWl6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png 424w, https://substackcdn.com/image/fetch/$s_!pWl6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png 848w, https://substackcdn.com/image/fetch/$s_!pWl6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png 1272w, https://substackcdn.com/image/fetch/$s_!pWl6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a3de995-8c9d-4d7f-b8f1-e2b638fad1ef_818x732.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Coach Maya grounds the guidance in the same grouping model the child can see on screen.</em></p><p>The coaching approach follows a simple progression.</p><h3>1. Notice</h3><p>Direct the child&#8217;s attention to something useful in the visual.</p><blockquote><p>&#8220;Look at the groups of 29. What does each complete group represent?&#8221;</p></blockquote><h3>2. Shift</h3><p>Offer another way to think about the same problem.</p><blockquote><p>&#8220;Could you use a friendly multiple of 29 to estimate how many groups might fit?&#8221;</p></blockquote><h3>3. Action</h3><p>Suggest one concrete step the child can take next.</p><blockquote><p>&#8220;Build one friendly chunk, subtract what it accounts for, and check what remains.&#8221;</p></blockquote><p>The purpose of the hint is not to finish the problem for the child. It is to help the child re-enter the problem with a manageable next step.</p><p>The guidance is designed to stay warm and growth-framed, using language such as:</p><ul><li><p>&#8220;Try again.&#8221;</p></li><li><p>&#8220;Almost!&#8221;</p></li><li><p>&#8220;Let&#8217;s look at it together.&#8221;</p></li><li><p>&#8220;What do you notice?&#8221;</p></li><li><p>&#8220;Which part could you try next?&#8221;</p></li></ul><p>A mistake is treated as useful information about what the child needs to see or try differently.</p><h2>What Parents Can Try Tonight</h2><p>When long division begins turning into a battle, pause before repeating the algorithm.</p><p>Try asking one of these questions instead:</p><blockquote><p>&#8220;What is being divided?&#8221;</p><p>&#8220;How large is each group?&#8221;</p><p>&#8220;About how big should the answer be?&#8221;</p><p>&#8220;What friendly chunk could we take out first?&#8221;</p><p>&#8220;How much is left after that chunk?&#8221;</p><p>&#8220;Can you draw the groups or build the total in rows?&#8221;</p></blockquote><p>These questions move the conversation away from remembering a rule and toward understanding a relationship.</p><p>You can always return to the written algorithm afterward. It will often make more sense once the child has something visual to connect it to.</p><h2>Peace of Mind for Parents</h2><p>Math Magic is free to play in a browser, with no signup required to start.</p><p>There are:</p><ul><li><p><strong>No ads</strong></p></li><li><p><strong>No in-app purchases</strong></p></li><li><p><strong>No paid levels required to continue learning</strong></p></li></ul><p>Math Magic follows a <strong>Learning Data Only</strong> approach: we collect only what learning needs. Learning data is never sold, never used for ads, and never shared with advertisers.</p><p>Families who choose to create a free profile can also use the Parent Hub to see a gentle, growth-framed snapshot of the week. Instead of harsh grades, skills are described with labels such as:</p><ul><li><p><strong>Strong</strong></p></li><li><p><strong>Growing</strong></p></li><li><p><strong>Let&#8217;s practice</strong></p></li><li><p><strong>Just starting</strong></p></li></ul><p>The goal is to help parents understand where a child is progressing and where a little more practice may help&#8212;without turning every mistake into a judgment.</p><h2>Long Division Does Not Have to Begin With the Bracket</h2><p>When a child struggles with long division, the solution is not always more repetition of the same procedure.</p><p>Sometimes the child needs to step back and see:</p><ul><li><p>the equal groups,</p></li><li><p>the approximate size of the answer,</p></li><li><p>the friendly chunks,</p></li><li><p>and the amount that remains.</p></li></ul><p>Once those ideas are visible, the symbols have something to stand on.</p><p>Take a breath. Put the worksheet aside for a moment. Draw the groups, estimate the answer, or build the total in rows.</p><p>Then return to the algorithm with meaning behind every step.</p><div><hr></div><p><strong>Ready to make division more visual?</strong></p><p>Play Math Magic free in your browser at <a href="https://mathmagicfun.info/">mathmagicfun.info</a>. No signup is required to start.</p>]]></content:encoded></item><item><title><![CDATA[Beyond Static Diagrams: Building Correctness-First Generative UI for Learning]]></title><description><![CDATA[How we combine verified components, declarative visual specifications, and sandboxed model-generated UI&#8212;without giving the model authority over mathematical truth.]]></description><link>https://shodhan.substack.com/p/beyond-static-diagrams-building-correctness</link><guid isPermaLink="false">https://shodhan.substack.com/p/beyond-static-diagrams-building-correctness</guid><dc:creator><![CDATA[motivatedpanda]]></dc:creator><pubDate>Sat, 18 Jul 2026 21:25:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!s4hA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;6822d34f-35a8-48e2-ba41-19629040ef55&quot;,&quot;duration&quot;:null}"></div><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://shodhan.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading saral&#8217;s Substack! 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>A child struggling with a math problem often does not need another paragraph. They need to see the relationship: objects being counted, fractions becoming equal-sized pieces, quantities moving along a number line, or one part of a whole being shared again.</p><p>The best visual is specific to the exact problem. But delivering that specificity creates a fundamental product tension.  <strong><a href="https://mathmagicfun.info/?utm_source=chatgpt.com">Explore Math Magic</a> to see this in action.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s4hA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s4hA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png 424w, https://substackcdn.com/image/fetch/$s_!s4hA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png 848w, https://substackcdn.com/image/fetch/$s_!s4hA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png 1272w, https://substackcdn.com/image/fetch/$s_!s4hA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s4hA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png" width="1068" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1068,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:236532,&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://shodhan.substack.com/i/207589140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.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_!s4hA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png 424w, https://substackcdn.com/image/fetch/$s_!s4hA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png 848w, https://substackcdn.com/image/fetch/$s_!s4hA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png 1272w, https://substackcdn.com/image/fetch/$s_!s4hA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ad23e3-080f-4db9-9731-d8d625ce0d14_1068x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Static diagrams are reliable, but they cannot cover every combination of numbers, operations, and stories. Model-generated diagrams can adapt to almost anything, but they can also present incorrect mathematics with complete visual confidence.</p><p>For a children&#8217;s learning product, that is not an acceptable trade.</p><p>We chose a different approach: <strong>use deterministic, verified visuals for the problem patterns we understand, and introduce model-generated UI only where its flexibility is necessary.</strong></p><p>The result is a correctness-first visual system that moves from authored components to declarative teaching specifications to sandboxed generation&#8212;while keeping grading and mathematical truth outside the model.</p><h2>Start with authority, not generation</h2><p>Much of today&#8217;s generative-UI work starts with the model:</p><blockquote><p>What interface can the model create?</p></blockquote><p>We started with a different question:</p><blockquote><p>How much authority does the model need to help this child&#8212;and what authority should it never receive?</p></blockquote><p>That led us to treat visual UI as a spectrum.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8ZOl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8ZOl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png 424w, https://substackcdn.com/image/fetch/$s_!8ZOl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png 848w, https://substackcdn.com/image/fetch/$s_!8ZOl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png 1272w, https://substackcdn.com/image/fetch/$s_!8ZOl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8ZOl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png" width="1456" height="758" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:758,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1241765,&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://shodhan.substack.com/i/207589140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.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_!8ZOl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png 424w, https://substackcdn.com/image/fetch/$s_!8ZOl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png 848w, https://substackcdn.com/image/fetch/$s_!8ZOl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png 1272w, https://substackcdn.com/image/fetch/$s_!8ZOl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbec8f34-2a3c-437d-baec-127ca150f175_1738x905.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Moving right increases flexibility. Moving left increases predictability, speed, and control.</em></p><p>The spectrum has four levels:</p><ul><li><p><strong>Static:</strong> fixed artwork or layouts.</p></li><li><p><strong>Parameterized:</strong> engineer-authored components whose values and state change with the problem.</p></li><li><p><strong>Declarative:</strong> typed specifications select and configure components from a verified visual vocabulary.</p></li><li><p><strong>Generative:</strong> a model creates new HTML or SVG when our existing vocabulary cannot represent the problem.</p></li></ul><p>Each step adds expressive power. It also gives the system more freedom&#8212;and therefore introduces more uncertainty.</p><p>Our governing principle is:</p><blockquote><p><strong>Use the least powerful UI tier capable of correctly teaching the current concept.</strong></p></blockquote><p>This is where our approach differs from the typical generative-UI demo. We are not using generation to replace the product interface. We are building an <strong>adaptive model of UI authority</strong>: the system escalates from verified structure to model-authored structure only when the learning situation requires it.</p><h2>A correctness-first cascade</h2><p>When a child asks for visual help, the on-demand experience follows a cascade.</p><p>The system first looks for a known learning representation. If one exists, structured problem data configures a verified component and renders it immediately.</p><p>If no suitable component exists, a deterministic router can produce a typed visual descriptor. That descriptor selects from a known vocabulary of number lines, fraction models, grouping visuals, place-value tools, and other manipulatives.</p><p>Only when the router cannot find an appropriate representation does the system escalate to model-generated UI.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!htC6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!htC6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!htC6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!htC6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!htC6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!htC6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1227869,&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://shodhan.substack.com/i/207589140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.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_!htC6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!htC6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!htC6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!htC6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff79c3eaa-4650-439a-abfc-aea1a3f2d998_1672x941.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Deterministic UI handles the common path. Model-drawn UI expands coverage for the long tail inside defined containment boundaries.</em></p><p>This ordering gives us three advantages:</p><ul><li><p><strong>Correctness:</strong> common problems use teaching structures we can inspect and test.</p></li><li><p><strong>Experience quality:</strong> deterministic visuals render immediately and behave consistently.</p></li><li><p><strong>Coverage:</strong> generation gives us a path for novel questions our component library does not yet support.</p></li></ul><p>The model expands the system&#8217;s reach. It does not become the default rendering engine.</p><h2>The visual system in practice</h2><p>The architecture becomes clearer through real examples.</p><p>At the common end of the spectrum, a parameterized manipulative lets a child act directly on visible objects. Declarative fraction models assemble verified teaching structures from problem data. For a contextual word problem, the system can create a tailored visual sequence that connects the story to the underlying mathematics.</p><p>The rendering method changes, but the governing principle remains constant: <strong>the visual guides the reasoning while deterministic systems retain authority over the answer.</strong></p><h3>1. Turn a static counting question into an action</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wzen!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wzen!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png 424w, https://substackcdn.com/image/fetch/$s_!wzen!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png 848w, https://substackcdn.com/image/fetch/$s_!wzen!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png 1272w, https://substackcdn.com/image/fetch/$s_!wzen!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wzen!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png" width="1100" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:265065,&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://shodhan.substack.com/i/207589140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.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_!wzen!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png 424w, https://substackcdn.com/image/fetch/$s_!wzen!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png 848w, https://substackcdn.com/image/fetch/$s_!wzen!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png 1272w, https://substackcdn.com/image/fetch/$s_!wzen!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c400b60-fa6a-4ada-92b9-9c851b1da7b6_1100x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Parameterized manipulative: the component owns the interaction, problem data supplies the objects, and the coach grounds each hint in what the child can tap on screen.</em></p><p>A basic counting question could be rendered as four cookies and an input box. Instead, the visual turns counting into an observable action.</p><p>The child taps each cookie once. The component tracks the count, while the answer remains for the child to provide.</p><p>The coach&#8217;s three hints progress deliberately:</p><ol><li><p>Establish the meaning of counting: give each object one number in order.</p></li><li><p>Offer another strategy: organize the objects into smaller groups.</p></li><li><p>Connect directly to the visual: tap each visible cookie once and say the count aloud.</p></li></ol><p>The component, interaction state, and coach language all refer to the same four visible objects.</p><p>This is more than parameter substitution. The authored component defines a testable teaching interaction, while the current problem supplies the objects and values.</p><h3>2. Make different denominators visible</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hKi9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hKi9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png 424w, https://substackcdn.com/image/fetch/$s_!hKi9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png 848w, https://substackcdn.com/image/fetch/$s_!hKi9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png 1272w, https://substackcdn.com/image/fetch/$s_!hKi9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hKi9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png" width="1120" height="1040" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:262263,&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://shodhan.substack.com/i/207589140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.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_!hKi9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png 424w, https://substackcdn.com/image/fetch/$s_!hKi9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png 848w, https://substackcdn.com/image/fetch/$s_!hKi9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png 1272w, https://substackcdn.com/image/fetch/$s_!hKi9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94c830d6-dad9-4394-be2b-74ee486ecac7_1120x1040.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em><strong>Declarative teaching UI: </strong>structured fraction data selects a verified bar model, preserves the unknowns, and gives the coach a shared visual language for guiding the next step.</em></p><p>Adding <code>1/4 + 2/5</code> is difficult because children often focus on the written numbers without understanding why the pieces must first become the same size.</p><p>The visual renders two bars:</p><ul><li><p>One divided into fourths.</p></li><li><p>One divided into fifths.</p></li><li><p>Both waiting to be repartitioned into a common unit.</p></li></ul><p>The unknown multipliers remain marked with <code>?</code>. The visual exposes the relationship without completing it.</p><p>The coach can now guide the child through what is actually on screen:</p><ul><li><p>Notice that the bars contain different-sized pieces.</p></li><li><p>Imagine cutting both bars into the same number of smaller pieces.</p></li><li><p>Use the visible <code>?/?</code> prompts to determine which partition fits both bars.</p></li></ul><p>The visual does not merely decorate the equation. It becomes the shared reasoning surface between the child and the coach.</p><h3>3. Show equivalent fractions as a transformation</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mAfS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mAfS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png 424w, https://substackcdn.com/image/fetch/$s_!mAfS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png 848w, https://substackcdn.com/image/fetch/$s_!mAfS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png 1272w, https://substackcdn.com/image/fetch/$s_!mAfS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mAfS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png" width="1120" height="660" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:660,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:189956,&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://shodhan.substack.com/i/207589140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.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_!mAfS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png 424w, https://substackcdn.com/image/fetch/$s_!mAfS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png 848w, https://substackcdn.com/image/fetch/$s_!mAfS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png 1272w, https://substackcdn.com/image/fetch/$s_!mAfS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a4848f-ce8a-413e-8178-3c07f1a11a85_1120x660.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Equivalent fractions become a visual transformation: the child maps fourths into smaller equal pieces while the coach grounds each hint in the two visible representations.</em></p><p>Equivalent fractions are often introduced as a rule: multiply the numerator and denominator by the same number.</p><p>That rule is correct, but it can hide the underlying meaning.</p><p>Here, the child starts with five fourths and constructs the same quantity using sixteenths. The missing numerator remains unknown. The child selects slices in the second representation to make the two quantities match.</p><p>The coach&#8217;s hints move from comparison to transformation:</p><ul><li><p>Compare the shaded quantity in the two representations.</p></li><li><p>Consider how each fourth divides into smaller pieces.</p></li><li><p>Count how many sixteenth-sized pieces correspond to one shaded fourth.</p></li></ul><p>The child does not simply apply a memorized procedure. The interface makes equivalence visible as a change in partition size while the total quantity remains constant.</p><p>This is what we mean by a declarative teaching vocabulary. The specification does not merely say &#8220;render two circles.&#8221; It expresses a mathematical relationship the component and coach can share.</p><p><strong>See guided visual learning in action</strong></p><p>Explore how Math Magic turns abstract problems into interactive, guided experiences for kids&#8212;from number lines and fraction models to contextual visual aids.</p><p><strong><a href="https://mathmagicfun.info/?utm_source=chatgpt.com">Explore Math Magic</a></strong></p><h3>4. Adapt the representation to the story</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s1HL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s1HL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png 424w, https://substackcdn.com/image/fetch/$s_!s1HL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png 848w, https://substackcdn.com/image/fetch/$s_!s1HL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!s1HL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s1HL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png" width="1456" height="974" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:974,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:162167,&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://shodhan.substack.com/i/207589140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.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_!s1HL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png 424w, https://substackcdn.com/image/fetch/$s_!s1HL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png 848w, https://substackcdn.com/image/fetch/$s_!s1HL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!s1HL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f1f66ce-bfe7-4145-ba6c-4df850959962_1570x1050.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Contextual visual generation: a multi-step word problem becomes a problem-specific bar model while deterministic grading retains authority over the answer.</em></p><p>Now consider a less standard problem:</p><blockquote><p>Lila has <code>3/5</code> of a chocolate bar and shares <code>2/3</code> of her portion. How much of the whole bar does her friend receive?</p></blockquote><p>This requires the child to reason about a fraction of another fraction. A generic fraction circle does not capture the sequence particularly well.</p><p>The contextual visual creates three stages:</p><ol><li><p>The whole chocolate bar divided into five equal parts.</p></li><li><p>Lila&#8217;s three-fifths identified within the whole.</p></li><li><p>Two-thirds of Lila&#8217;s portion selected for her friend.</p></li></ol><p>The representation preserves the story instead of immediately translating it into abstract arithmetic. The child can see that the second fraction operates on Lila&#8217;s portion&#8212;not on the entire bar.</p><p>This is where flexible visual composition becomes valuable. The system can adapt the representation to a multi-step context without allowing that representation to define or grade the correct answer.</p><h2>Interactive components become manipulatives</h2><p>These examples are not simply pictures with different numbers. They are manipulatives the child can operate: tapping, grouping, partitioning, selecting, and comparing.</p><p>Because engineers own the structure and interaction of verified components, we can test more than whether they render. We can test whether they:</p><ul><li><p>Use only values visible in the problem.</p></li><li><p>Preserve the intended mathematical relationship.</p></li><li><p>Hide the answer at the appropriate moment.</p></li><li><p>Support the teaching strategy for that concept.</p></li><li><p>Respond correctly to the child&#8217;s actions.</p></li><li><p>Give the coach a valid surface to reference.</p></li></ul><p>There is an important nuance: <strong>deterministic does not automatically mean pedagogically safe.</strong></p><p>A deterministic comparison component could still reveal <code>&lt;</code>, <code>&gt;</code>, or <code>=</code> before the child has reasoned through the relationship. Answer safety must therefore be verified at the component and interaction level. It is not automatically inherited from the rendering technology.</p><h2>Declarative UI becomes a teaching vocabulary</h2><p>Above the components sits a typed declarative layer.</p><p>Instead of requesting arbitrary markup, the system can describe a known teaching structure:</p><ul><li><p>Show a fraction area model.</p></li><li><p>Divide the whole into equal parts.</p></li><li><p>Shade only the values visible in the problem.</p></li><li><p>Keep the result unknown.</p></li><li><p>Ask the child to compare or transform the regions.</p></li></ul><p>A rendering engine maps that description onto a verified component.</p><p>This creates something more valuable than a UI library. It creates a <strong>visual teaching vocabulary</strong>.</p><p>The system can express concepts such as:</p><ul><li><p>Show equal groups.</p></li><li><p>Make repeated jumps on a number line.</p></li><li><p>Compare quantities without revealing the answer.</p></li><li><p>Repartition two fractions into equal-sized units.</p></li><li><p>Expose one step while keeping the next step unknown.</p></li><li><p>Represent the same relationship in a different way.</p></li></ul><p>Today, deterministic code produces these descriptors. That is deliberate. We receive the composability of declarative UI without introducing model variability into the common rendering path.</p><p>The router&#8217;s most valuable behavior is also its simplest: it can decline.</p><p>A multiplication-oriented fraction visual should not be shown for fraction addition merely because both questions are tagged as fractions.</p><blockquote><p><strong>Refusing to draw is better than presenting a confident visual with the wrong mathematical meaning.</strong></p></blockquote><h2>Generative UI handles the long tail</h2><p>No practical component library will anticipate every word problem, context, misconception, or useful representation.</p><p>For those cases, the system can ask a model to create a self-contained visual using HTML, CSS, and SVG.</p><p>This tier gives the product valuable flexibility:</p><ul><li><p>A novel story problem can receive a context-specific diagram.</p></li><li><p>An uncommon misconception can receive a different representation.</p></li><li><p>Visual coverage can expand without waiting for every component to be designed and shipped.</p></li></ul><p>But model-generated UI remains probabilistic.</p><p>A schema can constrain the output shape. Instructions can tell the model to guide rather than solve and mark unknown values with <code>?</code>. Neither proves that every generated diagram contains correct mathematics.</p><p>We therefore use generation to improve coverage&#8212;not to establish truth.</p><h2>Containment is not the same as correctness</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x4lN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x4lN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png 424w, https://substackcdn.com/image/fetch/$s_!x4lN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png 848w, https://substackcdn.com/image/fetch/$s_!x4lN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png 1272w, https://substackcdn.com/image/fetch/$s_!x4lN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x4lN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png" width="1456" height="867" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:867,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1350836,&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://shodhan.substack.com/i/207589140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.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_!x4lN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png 424w, https://substackcdn.com/image/fetch/$s_!x4lN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png 848w, https://substackcdn.com/image/fetch/$s_!x4lN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png 1272w, https://substackcdn.com/image/fetch/$s_!x4lN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01254d05-fb11-42ec-a0ab-7a74f9395cad_1625x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Allowing a model to create a visual introduces three separate questions:</p><ol><li><p>Is the underlying mathematical answer still authoritative?</p></li><li><p>Does the picture accurately represent the problem?</p></li><li><p>Can the generated output affect the rest of the product?</p></li></ol><p>These are different trust boundaries. Preventing generated content from changing the application does not prove that the picture teaches the right math.</p><h3>Mathematical truth stays deterministic</h3><p>The model does not define the correct answer or grade the child. Those decisions remain grounded in structured problem data and deterministic grading.</p><p>A generated visual may help explain the relationship, but it cannot change what the product considers correct.</p><p>This is an enforced boundary today.</p><h3>The visual must match the math</h3><p>This is the most important boundary for a learning product.</p><p>A diagram can be visually polished and still be wrong: a fraction bar can use the wrong number of parts, a number line can place values at incorrect distances, or a label can introduce a number that does not appear in the problem.</p><p>Our deterministic visuals provide the strongest protection because their geometry is derived from structured problem values. The same operands that create the question determine the partitions, labels, quantities, and interactions in the visual.</p><p>Raw generated visuals work differently today. The model receives the question and is instructed to:</p><ul><li><p>Use the values from the problem.</p></li><li><p>Preserve their mathematical proportions.</p></li><li><p>Keep the unknown hidden.</p></li><li><p>Guide the child without revealing the answer.</p></li><li><p>Check labels and relationships before returning the visual.</p></li></ul><p>We also inspect generated visuals through repeated QA. These controls reduce risk, but they do not prove factual correctness. The current system does not deterministically verify that every generated shape, proportion, or label matches the canonical problem before the child sees it.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hPqY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hPqY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!hPqY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!hPqY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!hPqY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hPqY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1495647,&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://shodhan.substack.com/i/207589140?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.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_!hPqY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!hPqY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!hPqY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!hPqY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47c0c635-0194-46d3-885e-aaaf5345bfad_1672x941.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>That is the most important gap in the generative path.</p><h3>From prompt compliance to verifiable visuals</h3><p>The next architectural step is to require the model to propose a typed visual specification before anything is rendered.</p><p>Instead of returning only a finished picture, the model would describe its mathematical intent in structured form:</p><ul><li><p>Which visual representation it selected.</p></li><li><p>Which operands it used.</p></li><li><p>Which relationship it is showing.</p></li><li><p>How the whole is partitioned.</p></li><li><p>Which quantities are visible.</p></li><li><p>Which value must remain unknown.</p></li></ul><p>The system can then validate that specification against the canonical problem:</p><ul><li><p>The operands match the structured question data.</p></li><li><p>The operation and relationship are correct.</p></li><li><p>Partitions and proportions represent the actual values.</p></li><li><p>Every visible number is permitted by the problem.</p></li><li><p>The unknown remains marked with <code>?</code>.</p></li><li><p>The correct answer is not exposed prematurely.</p></li></ul><p>Only a specification that passes those checks should be rendered for the child. If validation fails, the system should fall back to a verified component or a grounded text hint.</p><p>This changes the role of the model in an important way:</p><blockquote><p>The model proposes how to explain the math. Deterministic systems verify that the explanation matches the math.</p></blockquote><h3>Generated visuals cannot alter the product</h3><p>The third boundary is product isolation.</p><p>Model-generated output is treated as display content, not application logic. It cannot change the question, correct answer, grading result, student progress, or surrounding experience.</p><p>The implementation uses sanitization and browser isolation to enforce this boundary, but the product principle is simpler:</p><blockquote><p>The model can propose what the child sees; it cannot change how the product behaves.</p></blockquote><p>This protects the application from generated output. It does not establish the pedagogical accuracy of the visual&#8212;that requires the separate validation boundary described above.</p><h3>The trust model</h3><p>The resulting division of responsibility is:</p><ul><li><p><strong>Deterministic systems own mathematical truth and grading.</strong></p></li><li><p><strong>Verified components own common teaching interactions.</strong></p></li><li><p><strong>Models propose representations for unfamiliar situations.</strong></p></li><li><p><strong>Structured validation confirms that proposed visuals match the problem.</strong></p></li><li><p><strong>Product isolation prevents generated content from affecting application behavior.</strong></p></li><li><p><strong>QA measures whether the complete experience remains understandable and answer-safe.</strong></p></li></ul><p>The goal is not unrestricted generative UI. It is <strong>verifiable generative UI</strong>: enough flexibility to personalize the explanation, with deterministic checks protecting the mathematical relationship a child is asked to learn.</p><blockquote><p>For a learning product, preventing generated UI from running code is necessary. Proving that it represents the right math is the more important design challenge.</p></blockquote><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://shodhan.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading saral&#8217;s Substack! 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[Inference Is a Memory Problem: A Systems View of Serving LLMs]]></title><description><![CDATA[The mental models behind LLM serving &#8212; for platform engineers, TPMs, and anyone navigating AI infrastructure decisions.]]></description><link>https://shodhan.substack.com/p/inference-is-a-memory-problem-a-systems</link><guid isPermaLink="false">https://shodhan.substack.com/p/inference-is-a-memory-problem-a-systems</guid><dc:creator><![CDATA[motivatedpanda]]></dc:creator><pubDate>Thu, 16 Jul 2026 18:02:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WftI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8681913e-0d4a-4541-bb97-4e247257ccf2_2048x1365.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Every time you hit &#8220;send&#8221; on a prompt, you&#8217;re entering a latency, throughput, and cost tradeoff &#8212; the invisible constraints behind delivering intelligence at scale</strong></p><p>Behind the scenes, GPUs stream tens of billions of parameters, allocate gigabytes of per-user state, and juggle tight memory limits that determine how fast you see a response &#8212; and how many others can use the system at the same time.</p><p>As models become more capable, deployment constraints inevitably become the bottleneck. Raw capability scales with parameters. Deployment cost scales with memory movement and utilization. If we care about making advanced AI broadly beneficial, we have to solve the systems problem: how to serve increasingly capable models in a way that is economically sustainable and operationally predictable.</p><p>Inference engineering is where safety, reliability, and economics converge. It ensures that powerful models can actually be deployed responsibly &#8212; not just trained.</p><p>If you work in systems, infrastructure, or platform engineering, these dynamics will feel familiar &#8212; just operating at a very different scale. The mental models below are the ones that made LLM inference finally click for me.</p><div><hr></div><h2>The One Sentence Version</h2><p>Every LLM inference problem boils down to three things fighting over GPU memory: model weights (fixed rent), KV cache (variable cost per user), and working memory. When the room is full, you either shrink something or add more GPUs.</p><p>That&#8217;s it. Everything else is implementation detail.</p><p>This constraint &#8212; fixed model weights, growing per-user state, and finite GPU memory &#8212; drives nearly every design decision in modern inference systems.</p><div><hr></div><h2>The Capacity Math That Actually Matters</h2><p>Here&#8217;s the framework that keeps coming up when thinking about &#8220;can we serve model X at context length Y to Z users?&#8221;</p><p><strong>Step 1 &#8212; Do the weights fit?</strong> A 70B parameter model in FP16 needs 140 GB. That&#8217;s almost two H100s just for the weights. Quantize to INT8 and it&#8217;s 70 GB &#8212; now it fits on one GPU with room to spare.</p><p><strong>Step 2 &#8212; What&#8217;s the per-request KV cache cost?</strong> At the target context length, how much memory does each concurrent user consume? This scales linearly with context length.</p><p><strong>Step 3 &#8212; How many users can you serve simultaneously?</strong> Take whatever GPU memory is left after weights, divide by per-request KV cache cost. That&#8217;s your concurrency limit.</p><p>The numbers tell a stark story. On 4x H100s (320 GB total) with a 70B FP16 model:</p><ul><li><p>At 4K context: ~90 concurrent users</p></li><li><p>At 32K context: ~11 concurrent users</p></li><li><p>At 128K context: ~2 concurrent users</p></li></ul><p>Doubling context length roughly halves your concurrent capacity. This is the fundamental tension that every inference team lives with.</p><p>For a deeper dive into the math, Carol Chen's <a href="https://kipp.ly/transformer-inference-arithmetic/">Transformer Inference Arithmetic</a> breaks it down from first principles.</p><div><hr></div><h2>Prefill vs. Decode: The Two Phases Nobody Explains Well</h2><p>When you send a prompt to an LLM, two very different things happen.</p><p><strong>Prefill</strong> processes all your input tokens in parallel. It&#8217;s compute-bound &#8212; the GPU is doing math as fast as it can. This is where the KV cache gets built. The time this takes is your Time to First Token (TTFT) &#8212; that pause before the response starts streaming.</p><p><strong>Decode</strong> generates one token at a time, sequentially. It&#8217;s memory-bandwidth-bound &#8212; the GPU spends most of its time <em>reading</em> the KV cache, not doing math. The speed here is your Tokens Per Second (TPS)  or time between tokens &#8212; how fast the response streams.</p><p>These two phases have fundamentally different bottlenecks. This single insight unlocks most of the inference optimization landscape. If you&#8217;re trying to improve TTFT, you need more compute (tensor parallelism, chunked prefill). If you&#8217;re trying to improve TPS, you need more memory bandwidth (better hardware, quantization, PagedAttention).</p><p>This <a href="https://youtu.be/4Beffz-HNsk?si=o5lOfO7Ry_LdFDLk">gang scheduling @scale talk</a> does a great job at explaining these concepts and their implications:</p><div><hr></div><h2>The KV Cache: The Real Main Character</h2><p>If there&#8217;s one concept that ties everything together, it&#8217;s the KV cache.</p><p>During attention, every token produces a Key vector (&#8221;what do I contain?&#8221;) and a Value vector (&#8221;what information do I carry?&#8221;). The model scores each new token&#8217;s Query against all previous Keys to figure out what&#8217;s relevant, then pulls the corresponding Values. Without caching, you&#8217;d recompute all of these for every single generated token. The KV cache stores them so you don&#8217;t have to.</p><p>The problem? It grows linearly with context length, number of layers, and number of attention heads. For a 70B parameter model at 4K context, you&#8217;re looking at roughly 2 GB of KV cache <em>per request</em>. Push that to 128K context? Now it&#8217;s 64 GB. An H100 GPU has 80 GB total, and the model weights already take ~35 GB.</p><p>This is why long-context models are so expensive to serve. It&#8217;s not the compute &#8212; it&#8217;s the memory.</p><div><hr></div><h2>The Optimization Toolkit</h2><p>Once you understand the three pressures &#8212; longer prompts, bigger models, more users &#8212; the optimization techniques start to make intuitive sense. Outlined below are some of the few that i spent time learning, each one is attacking a specific bottleneck.</p><p><strong>Continuous batching</strong> keeps the GPU busy by filling empty slots immediately as requests complete, rather than waiting for an entire batch to finish. Simple concept, massive impact on utilization.</p><p><strong>Chunked prefill</strong> (SARATHI) splits large prefills into smaller pieces and processes them alongside ongoing decode requests. The decode requests essentially &#8220;piggyback&#8221; for near-free. This prevents one user&#8217;s 100K-token prompt from blocking everyone else&#8217;s streaming responses.</p><p><strong>PagedAttention</strong> <a href="https://arxiv.org/abs/2309.06180">from vLLM</a>, borrows the concept of virtual memory from operating systems. Instead of allocating one big contiguous block of memory per request's KV cache, it uses small pages assigned on demand. Near-zero waste. More concurrent users on the same hardware. For all of us who built virtual memory systems for operating systems, this one feels immediately familiar &#8212; the problems and solutions map remarkably well.</p><p><strong>Prompt caching</strong> is beautifully simple: if multiple requests share the same prefix (think: same system prompt, same codebase), reuse the KV cache from the first prefill. A 50K token prefill becomes a 100-token one for follow-up questions.</p><p><strong>Quantization</strong> reduces precision from FP16 &#8594; INT8 &#8594; INT4. Less memory, faster inference, lower cost. The tradeoff is potential quality degradation, but modern quantization techniques are remarkably good at preserving quality.</p><p><strong>Speculative decoding</strong> uses a small, fast &#8220;draft&#8221; model to guess the next N tokens, then has the large model verify them all in parallel. When guesses are right (and they often are), you get N tokens for the cost of one verification pass. Cursor took this even further &#8212; for code edits where ~95% of tokens are unchanged, they use the <em>original file</em> as the draft and get 9&#8211;13x speedups. It&#8217;s one of the best examples of domain-specific inference optimization out there.</p><p>These are just the techniques I spent time on &#8212; the optimization space is deep and evolving fast.</p><div><hr></div><h2>The Distributed Inference Picture</h2><p>At scale, a single optimization technique isn&#8217;t enough. The full picture looks something like this:</p><p><strong>Tensor parallelism</strong> splits weight matrices across GPUs so each one computes a slice of the same layer. Great for prefill (more compute), less helpful for decode (the bottleneck is bandwidth, not compute).</p><p><strong>Disaggregated prefill/decode</strong> puts these two phases on separate machines entirely. Different bottlenecks &#8594; different hardware needs &#8594; separate scaling. More complex to manage, but better utilization.</p><p><strong>Context parallelism</strong> handles extremely long inputs by splitting them across machines. A 10M token prefill that would take 30 minutes on one machine takes ~1 minute on 30 machines.</p><p><strong>Expert parallelism</strong> (for Mixture-of-Experts models) distributes experts across hosts to increase aggregate memory bandwidth during decode.</p><p>All of these introduce <strong>shared fate</strong> &#8212; when multiple machines must all be healthy to serve a single request, one failure takes down the whole group. If you&#8217;ve done any reliability work, your ears should be perking up. This maps directly to blast radius analysis, capacity planning (you need spare groups, not spare hosts), and group-level health monitoring. The problems are the same ones platform engineers have been solving for years &#8212; they just come with much higher stakes when your GPU fleet costs millions per month.</p><div><hr></div><h2>Why This Matters</h2><p>The infrastructure behind AI isn&#8217;t magic. It&#8217;s systems engineering with very expensive hardware and very tight constraints. The tradeoff conversations between product teams wanting more features (longer context! bigger models!) and infrastructure teams managing cost and complexity? Those are timeless.</p><p>What changes the game is the math. When doubling context length halves your serving capacity, the cost implications of a product decision are immediate and concrete. When a single inference request might span 30 machines with shared fate, reliability planning looks fundamentally different.</p><p>Understanding these concepts &#8212; even at a high level &#8212; changes the quality of conversations you can have about AI systems, whether you&#8217;re building them, managing them, or making decisions about them.</p><div><hr></div><p><em>I hope this guide is useful. The best way to build real intuition is to do the math yourself &#8212; pick a model size, estimate the KV cache, and see how many users you can actually serve. The numbers are humbling.</em></p><p><em>If you want to go deeper, here are the resources that helped me the most:</em></p><div><hr></div><h2>Resources &amp; Further Reading</h2><p><strong>Foundational Concepts</strong></p><ul><li><p><a href="https://jalammar.github.io/illustrated-transformer/">The Illustrated Transformer</a> &#8212; Jay Alammar&#8217;s visual walkthrough of attention, Q/K/V, and multi-head attention. Start here.</p></li><li><p><a href="https://magazine.sebastianraschka.com/p/coding-the-kv-cache-in-llms">Coding the KV Cache in LLMs</a> &#8212; Sebastian Raschka&#8217;s hands-on guide to understanding the KV cache by building one.</p></li><li><p><a href="https://developer.nvidia.com/blog/mastering-llm-techniques-inference-optimization/">NVIDIA: Mastering LLM Techniques &#8212; Inference Optimization</a> &#8212; Comprehensive overview of optimization techniques with hardware context.</p></li><li><p><a href="https://kipp.ly/transformer-inference-arithmetic/">Transformer Inference Arithmetic</a> &#8212; The math behind inference costs broken down from first principles. Essential for building intuition around compute vs. memory bandwidth bottlenecks.</p></li></ul><p><strong>Key Papers</strong></p><ul><li><p><a href="https://arxiv.org/abs/2308.16369">SARATHI: Efficient LLM Inference with Piggybacking</a> &#8212; The chunked prefill paper that enables up to 10x decode throughput.</p></li><li><p><a href="https://arxiv.org/abs/2309.06180">PagedAttention / vLLM</a> &#8212; Virtual memory for KV cache. Changed how everyone thinks about memory management for inference.</p></li></ul><p><strong>Talks &amp; Courses</strong></p><ul><li><p><a href="https://www.youtube.com/watch?v=mYRqvB1_gRk&amp;t=1165s">Exploring the Latency/Throughput &amp; Cost Space for LLM Inference</a> &#8212; Deep dive into the tradeoffs between latency, throughput, and cost when serving LLMs at scale.</p></li><li><p><a href="https://www.youtube.com/watch?v=4Beffz-HNsk&amp;t=710s">Meta&#8217;s Distributed Inference Architecture</a> &#8212; Disaggregated prefill/decode, context parallelism, expert parallelism, and shared fate at scale.</p></li><li><p><a href="https://www.youtube.com/watch?v=9tvJ_GYJA-o&amp;t=1727s">LLM Inference Explained (Visual Guide)</a> &#8212; Clear walkthrough of how model size maps to inference cost.</p></li><li><p><a href="https://www.youtube.com/watch?v=TJ5K1CO9Wbs&amp;t=8s">Speculative Decoding Explained</a> &#8212; How draft models turn sequential decode into parallel verification.</p></li><li><p><a href="https://learn.deeplearning.ai/courses/efficiently-serving-llms/lesson/jhfqj/text-generation">DeepLearning.AI: Efficiently Serving LLMs</a> &#8212; Hands-on course covering continuous batching, quantization, and serving fundamentals.</p></li></ul><p><strong>Real-World Applications</strong></p><ul><li><p><a href="https://cursor.com/blog/instant-apply">Cursor: Instant Apply with Speculative Edits</a> &#8212; How Cursor gets 9&#8211;13x speedups by using the original file as the speculative decoding draft. One of the best examples of domain-specific inference optimization.</p></li></ul><div><hr></div><p><em>The ideas expressed in this post are those of publicly known or theoretical models and benchmarks and do not necessarily reflect the architectures or latencies of my employer.</em></p>]]></content:encoded></item><item><title><![CDATA[# Who Grades the Coach?]]></title><description><![CDATA[### Building an evaluation system that catches an AI tutor&#8217;s mistakes before a kid does]]></description><link>https://shodhan.substack.com/p/who-grades-the-coach</link><guid isPermaLink="false">https://shodhan.substack.com/p/who-grades-the-coach</guid><dc:creator><![CDATA[motivatedpanda]]></dc:creator><pubDate>Thu, 16 Jul 2026 18:00:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!iCS5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iCS5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iCS5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png 424w, https://substackcdn.com/image/fetch/$s_!iCS5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png 848w, https://substackcdn.com/image/fetch/$s_!iCS5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png 1272w, https://substackcdn.com/image/fetch/$s_!iCS5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iCS5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png" width="1456" height="1009" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1009,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:143414,&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://shodhan.substack.com/i/207318080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.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_!iCS5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png 424w, https://substackcdn.com/image/fetch/$s_!iCS5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png 848w, https://substackcdn.com/image/fetch/$s_!iCS5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png 1272w, https://substackcdn.com/image/fetch/$s_!iCS5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9691ef39-3d6b-43f5-b051-3255a5dea592_1728x1198.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The app I work on has an AI coach that gives real-time feedback to kids working through fractions, decimals, and long division. It&#8217;s warm, it&#8217;s patient, and &#8212; like any LLM &#8212; it is capable of quietly getting worse in ways that never show up as a bug.</p><p>A bad prompt edit doesn&#8217;t crash anything. It just starts leaking an answer before the child has worked for it, or inventing a number that isn&#8217;t actually in the problem, or teaching the wrong method with total, cheerful confidence. None of that trips a unit test. It ships clean, and it stays there until a parent notices.</p><p>So I built the system that&#8217;s supposed to notice first.</p><p><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">##</span> The problem with grading an AI tutor</p><p>You can&#8217;t spot-check your way to confidence here. A regression might show up in one concept out of a dozen, on one phrasing out of a hundred, only some of the time. The only way to catch it is to read what the coach actually says, at scale, against a real teaching standard, on a schedule &#8212; and to be honest with yourself about what &#8220;better&#8221; actually means when the thing doing the measuring is <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">*</span><em>also</em><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">*</span> an LLM.</p><h2><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">##</span> How the system works</h2><p>Each test case pairs a real question with a <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>teaching anchor</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> &#8212; the specific method a kid should come away understanding. Not just &#8220;the answer is right,&#8221; but <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">*</span><em>why</em><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">*</span>: &#8220;compare fractions by a common denominator or benchmark,&#8221; for example, not &#8220;convert to decimals&#8221; or any other technically-valid-but-off-target explanation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NLq9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NLq9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png 424w, https://substackcdn.com/image/fetch/$s_!NLq9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png 848w, https://substackcdn.com/image/fetch/$s_!NLq9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png 1272w, https://substackcdn.com/image/fetch/$s_!NLq9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NLq9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png" width="1456" height="950" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:950,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:204445,&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://shodhan.substack.com/i/207318080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.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_!NLq9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png 424w, https://substackcdn.com/image/fetch/$s_!NLq9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png 848w, https://substackcdn.com/image/fetch/$s_!NLq9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png 1272w, https://substackcdn.com/image/fetch/$s_!NLq9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09f32bec-35ef-4322-bdf9-dc120a7b4f24_1728x1128.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The pipeline runs like this:</p><p>1. <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>Probe case</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> &#8212; a real question and student answer, mapped to a concept&#8217;s teaching anchor.</p><p>2. <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>Coach</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> &#8212; the actual production prompt generates a reply. Not a mock, not a simplified stand-in &#8212; the real thing a kid would see.</p><p>3. <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>Judge</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> &#8212; an independent model, often from a different model family than the coach itself, scores the reply against the anchor.</p><p>4. <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>Safety gate</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> &#8212; three of six criteria are zero-tolerance. A single failure blocks the pipeline, no matter how good the average score looks.</p><p>5. <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>Report</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> &#8212; a timestamped, versioned scorecard, trended against the last run and the last week.</p><h2><strong><span>##</span> LLM As Judge: What the Independent Judge actually catches</strong></h2><p>Up to this point, the judge grading the coach had always come from the same model family as the coach itself &#8212; close to a student grading their own homework. Recently I finally got a genuinely different model doing the grading, and the difference showed up immediately.</p><p>One example makes the point well. A student was asked to solve 46 &#215; 10, and the coach&#8217;s explanation was the classic shortcut: &#8220;just add a zero to the end&#8221; (46 &#8594; 460). That gets the right answer here. But it&#8217;s not real understanding &#8212; it&#8217;s a memorized trick that quietly breaks the moment decimals enter the picture (try &#8220;adding a zero&#8221; to 4.6 &#215; 10 or 0.5 &#215; 10 and it stops making sense). The actual concept the curriculum wants taught is that multiplying by 10 shifts every digit one place to the left &#8212; a rule that works for any number, not just this one.</p><p>The same-family judge scored that explanation as fine. The independent judge didn&#8217;t, and said exactly why: <em>&#8220;the &#8216;add a zero&#8217; trick rather than the expected place-value anchor of noticing each digit shifts one place left... a common misconception-prone shortcut that doesn&#8217;t teach place-value understanding.&#8221;</em></p><p>It wasn&#8217;t a one-off. The same independent grading caught a hint on 467 + 358 that never mentioned carrying the ten &#8212; even though 7 + 8 = 15 requires it &#8212; and a long-division hint that walked a student toward the answer without ever checking that a remainder has to be smaller than the divisor, which was the actual point of that question. Three separate cases, all technically-not-wrong, all missing the real teaching point, and all invisible to a judge grading from the same model family as the thing it was grading.</p><p></p><p><strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">##</span> The rubric: six criteria, and they&#8217;re not all equal</strong></p><p>A high average score is meaningless if the coach handed a kid the answer even once. So the rubric splits cleanly into two tiers:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iJJN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iJJN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png 424w, https://substackcdn.com/image/fetch/$s_!iJJN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png 848w, https://substackcdn.com/image/fetch/$s_!iJJN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png 1272w, https://substackcdn.com/image/fetch/$s_!iJJN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iJJN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png" width="1456" height="1242" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1242,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:212008,&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://shodhan.substack.com/i/207318080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.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_!iJJN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png 424w, https://substackcdn.com/image/fetch/$s_!iJJN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png 848w, https://substackcdn.com/image/fetch/$s_!iJJN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png 1272w, https://substackcdn.com/image/fetch/$s_!iJJN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb05d20a6-1006-46fa-9d66-d378f5a76531_1728x1474.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The safety-gate criteria don&#8217;t get averaged in with the rest. They fail the build, full stop, independent of everything else &#8212; because a coach that&#8217;s 95% excellent and 5% &#8220;here&#8217;s the answer&#8221; isn&#8217;t 95% safe. It&#8217;s not safe.</p><p></p><h2><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">##</span> A weekly loop that&#8217;s only allowed to make small moves</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bpxH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bpxH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png 424w, https://substackcdn.com/image/fetch/$s_!bpxH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png 848w, https://substackcdn.com/image/fetch/$s_!bpxH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!bpxH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bpxH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png" width="1448" height="1086" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1086,&quot;width&quot;:1448,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1299691,&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://shodhan.substack.com/i/207318080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.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_!bpxH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png 424w, https://substackcdn.com/image/fetch/$s_!bpxH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png 848w, https://substackcdn.com/image/fetch/$s_!bpxH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!bpxH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03eab5e-9815-4c32-a319-00c5833f41b1_1448x1086.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>1. <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>Measure.</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> Run the full probe suite against the live prompt. Every run writes a new, versioned report &#8212; nothing overwrites history, so trends are real trends, not vibes.</p><p>2. <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>Target.</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> Pick the one or two weakest concepts. Never try to fix everything in one pass.</p><p>3. <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>Verify.</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> Re-run before and after. A score change under the noise floor doesn&#8217;t count as an improvement &#8212; LLM scoring is not perfectly deterministic, even at temperature 0, and I&#8217;d rather under-claim progress than chase noise.</p><p>4. <span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span><strong>Ship.</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> Open a pull request with the evidence attached &#8212; the before/after reports, the gate results, the reasoning. A person merges it. The system never merges child-facing coaching logic on its own.</p><p></p><p></p><h3><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">##</span> The fix that looked good and wasn&#8217;t</h3><p>Here&#8217;s the part I actually want to tell you about, because it&#8217;s the whole reason this system is worth having.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!15Dk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!15Dk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png 424w, https://substackcdn.com/image/fetch/$s_!15Dk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png 848w, https://substackcdn.com/image/fetch/$s_!15Dk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!15Dk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!15Dk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png" width="1448" height="1086" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1086,&quot;width&quot;:1448,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1496881,&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://shodhan.substack.com/i/207318080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.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_!15Dk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png 424w, https://substackcdn.com/image/fetch/$s_!15Dk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png 848w, https://substackcdn.com/image/fetch/$s_!15Dk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!15Dk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061fab45-e1ca-407f-9d87-d577c8eb6703_1448x1086.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I once made a tightly scoped prompt edit to improve two weak concepts. On the next run, both scores went up. If I had looked only at the intended outcomes, I would have called it a success.</p><p>But an unrelated concept&#8212;one the instruction explicitly said not to affect&#8212;fell from 95 to 75.</p><p>That was the more important result.</p><p>Rather than rationalize the drop as model noise, I ran a control: the same probe suite, with only the prompt edit removed. The concept returned to its previous range. The regression followed the edit.</p><p>The lesson was not simply that this particular wording was wrong. It was that prompt scope is not a dependable safety boundary. Once an instruction enters the context, the model may generalize it beyond the concepts it names&#8212;even when the prompt explicitly tells it not to.</p><p>So the change stopped before review. I reverted it, replaced it with a narrower intervention, and documented the failure mode so the team would not have to rediscover it later.</p><p>That is what the evaluation system is really protecting against. It does not only test whether the product is improving. It tests whether the proposed fix is safe enough to become part of the product.</p><p>The two intended gains were real. They still were not enough to ship.</p><p></p><p><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">##</span> What the system is not allowed to do</p><p>A few rules keep this honest:</p><p><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">- **</span><strong>Never grade the grader.</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> The rubric and its thresholds can&#8217;t be loosened to inflate a score. Only a proven bug in the judge itself &#8212; isolated, tested, called out explicitly &#8212; can touch the grading logic.</p><p><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">- **</span><strong>A regression is not a vibe.</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> Every claimed improvement is checked against a noise floor across repeated runs, not read off a single before/after diff.</p><p><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">- **</span><strong>The gate ships with the code.</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> Safety criteria run in CI, not just in a report. A pull request can&#8217;t merge over a leaked answer.</p><p><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">- **</span><strong>A person always signs off.</strong><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">**</span> Every coaching-logic change ships as a draft. A human is the last check before a child ever sees it.</p><p>---</p><p><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">*</span><em>This is the eval and safety infrastructure behind an AI math coach for kids &#8212; built so that &#8220;the AI seems fine&#8221; is never the bar, and so the system that watches the coach is at least as disciplined as the coach itself.</em><span data-color="rgb(191, 133, 85)" style="color: rgb(191, 133, 85);">*</span></p>]]></content:encoded></item><item><title><![CDATA[# Building a Full-Stack Trivia Platform in 7 Days. Here’s How.]]></title><description><![CDATA[TL;DR: One week.]]></description><link>https://shodhan.substack.com/p/building-a-full-stack-trivia-platform</link><guid isPermaLink="false">https://shodhan.substack.com/p/building-a-full-stack-trivia-platform</guid><dc:creator><![CDATA[motivatedpanda]]></dc:creator><pubDate>Sat, 21 Feb 2026 05:47:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Oyld!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR:</strong> One week. One developer. One AI-powered toolkit. 97 trivia questions, a live leaderboard, Super Bowl Squares with QR sharing, photo uploads, an expense splitter, and zero-password auth. Next.js 16 + Supabase + Shadcn + v0 + Claude Code did the heavy lifting. Here&#8217;s the day-by-day breakdown of building fast by standing on the shoulders of giant component libraries and AI pair programmers.</p><p>https://hawks-nation.vercel.app/marketing/seahawks-trivia-invite.html</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://shodhan.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading saral&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2><strong>Why One Week?</strong></h2><p>The Super Bowl doesn&#8217;t wait. We had the idea on a Monday and needed a working app by Sunday -- not a prototype, not an MVP with asterisks, but something 30+ people could use simultaneously at a party without anything catching fire.</p><p>The constraints were brutal and clarifying:</p><ul><li><p><strong>No sign-up flow.</strong> Nobody at a party is verifying their email.</p></li><li><p><strong>Every phone must work.</strong> No app store. No downloads. Just a URL.</p></li><li><p><strong>Multiple game modes.</strong> Trivia, Squares, photo sharing, expense splitting.</p></li><li><p><strong>Live synchronization.</strong> During the actual game, everyone sees the same question at the same time.</p></li><li><p><strong>One developer.</strong> No hand-offs. No PR reviews. No meetings about meetings.</p></li><li><p><strong>Move fast.</strong> Reuse everything that&#8217;s already been solved. Write only the novel parts.</p></li></ul><p>The secret weapon wasn&#8217;t working harder -- it was never writing code that already existed.</p><p>Here&#8217;s how each day went.</p><div><hr></div><h2><strong>Day 1: Foundation (Monday)</strong></h2><p><strong>Shipped:</strong> Project scaffolding, database schema, auth system</p><p>The single best decision of the whole week: <strong>Supabase + Next.js API routes.</strong> This combo eliminated entire categories of work:</p><pre><code><code>Frontend:   Next.js 16 + React 19 + TypeScript 5
UI:         Radix UI + Tailwind CSS 4
Backend:    Next.js API Routes (stateless)
Database:   Supabase (Postgres + Row Level Security)
Auth:       FingerprintJS
Deploy:     Vercel
</code></code></pre><p>No Kubernetes. No microservices. No separate backend repo. No Docker Compose file that &#8220;works on my machine.&#8221;</p><p>But the real accelerant wasn&#8217;t the framework -- it was the toolchain on top of it:</p><ul><li><p><strong>Shadcn/ui</strong> -- 57 pre-built, accessible UI components (buttons, dialogs, forms, cards, dropdowns) dropped in via CLI. Zero time spent on design system primitives.</p></li><li><p><strong>v0.dev</strong> -- Vercel&#8217;s AI UI generator for rapid screen prototyping. Describe what you want, get a working React component back. Nine separate PRs came from v0-generated code.</p></li><li><p><strong>Claude Code</strong> -- AI pair programmer that handled feature branches end-to-end: trivia logic, Super Bowl Squares, expense splitting, admin controls. Not autocomplete -- full feature implementation across multiple files.</p></li></ul><p>This is the modern solo-developer stack: you write the business logic and the glue. AI writes the boilerplate. A component library handles the UI primitives. You ship in a week what used to take a month.</p><p>For auth, we skipped every conventional approach and used <strong>FingerprintJS</strong> for device-level identification:</p><pre><code><code>userId = `${username}_${random4Digits}`
</code></code></pre><p>Pick a username, pick an avatar, you&#8217;re in. The device fingerprint handles returning-user detection. Total time from &#8220;open URL&#8221; to &#8220;playing trivia&#8221;: ~8 seconds.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Oyld!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Oyld!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png 424w, https://substackcdn.com/image/fetch/$s_!Oyld!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png 848w, https://substackcdn.com/image/fetch/$s_!Oyld!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png 1272w, https://substackcdn.com/image/fetch/$s_!Oyld!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Oyld!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png" width="1180" height="1498" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1498,&quot;width&quot;:1180,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:188949,&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://shodhan.substack.com/i/188687766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.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_!Oyld!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png 424w, https://substackcdn.com/image/fetch/$s_!Oyld!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png 848w, https://substackcdn.com/image/fetch/$s_!Oyld!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png 1272w, https://substackcdn.com/image/fetch/$s_!Oyld!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348a83bc-33f0-4060-b97d-ef2daac22db1_1180x1498.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Is this enterprise-grade? No. Did it save two full days of auth plumbing? Yes.</p><p><strong>Time saved by saying no:</strong> OAuth integration (~4 hrs), email verification flow (~3 hrs), password reset (~2 hrs), session management (~2 hrs). That&#8217;s 11 hours -- nearly 1.5 days of the entire timeline.</p><div><hr></div><h2><strong>Day 2: The Trivia Engine (Tuesday)</strong></h2><p><strong>Shipped:</strong> Question database, category system, scoring, timer</p><p>97 questions across 15 categories, seeded via SQL:</p><ul><li><p>Super Bowl XLVIII, Legion of Boom, Russell Wilson Era</p></li><li><p>Seahawks Legends, 2025 Season Stats, Hall of Fame</p></li><li><p>Franchise Firsts, and 8 more</p></li></ul><p>Each question has a 15-second countdown. Scoring uses base points plus streak bonuses -- get 5 in a row and you&#8217;re racking up multipliers.</p><p>The key architectural choice: <strong>idempotent answer submission.</strong> With 30 phones on party Wi-Fi, double-taps are inevitable:</p><pre><code>const existing = await getAnswer(userId, questionId);
if (existing) return { already_answered: true, ...existing };
// Only record new answers</code></pre><p>No duplicate scores. No database constraint errors. No support tickets from angry fans. This took 20 minutes to implement and saved hours of debugging later.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XDgM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XDgM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png 424w, https://substackcdn.com/image/fetch/$s_!XDgM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png 848w, https://substackcdn.com/image/fetch/$s_!XDgM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png 1272w, https://substackcdn.com/image/fetch/$s_!XDgM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XDgM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png" width="774" height="1550" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1550,&quot;width&quot;:774,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:167208,&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://shodhan.substack.com/i/188687766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.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_!XDgM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png 424w, https://substackcdn.com/image/fetch/$s_!XDgM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png 848w, https://substackcdn.com/image/fetch/$s_!XDgM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png 1272w, https://substackcdn.com/image/fetch/$s_!XDgM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F648c18cd-dc6c-4f02-8ab5-d44683d1e5c9_774x1550.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><h2><strong>Day 3: Leaderboard + Progressive Unlock (Wednesday)</strong></h2><p><strong>Shipped:</strong> Real-time scoreboard, category unlock system, SWR data layer</p><p>The leaderboard refreshes every 30 seconds using <strong>SWR&#8217;s </strong><code>refreshInterval</code>. We considered WebSocket push and rejected it in about 10 minutes:</p><ul><li><p>SWR gives us stale-while-revalidate (no loading spinners)</p></li><li><p>Automatic request deduplication</p></li><li><p>Built-in error retry</p></li><li><p>Zero server-side connection state</p></li></ul><p>The leaderboard isn&#8217;t a stock ticker. 30-second staleness is invisible to users. <strong>Choosing boring technology saved an entire day.</strong></p><p>We also built a <strong>progressive category unlock system</strong> -- categories gate by date across the pre-game week. Day 1 opens &#8220;Seahawks Legends.&#8221; Day 5 unlocks &#8220;2025 Season Stats.&#8221; Game day opens the finale. This turned a one-session app into a week-long engagement loop with zero extra backend work -- just a date comparison in the API.</p><div><hr></div><h2><strong>Day 4: Super Bowl Squares (Thursday)</strong></h2><p><strong>Shipped:</strong> 10x10 grid, square claiming, board locking, auto-scoring, QR sharing</p><p>This was the most complex single feature, and JSONB made it possible in one day:</p><pre><code>squares_data JSONB NOT NULL DEFAULT &#8216;{}&#8217;</code></pre><p>One flexible column instead of a rigid schema. When we needed to add Q1/Q2/Q3/Q4 tracking mid-afternoon, it was just another key in the object. No migration. No downtime. No schema debate.</p><p>The flow:</p><ol><li><p><strong>Create a game</strong> -- generates a 6-character share code + QR code</p></li><li><p><strong>Claim squares</strong> -- tap individual cells or batch-select entire rows</p></li><li><p><strong>Lock the board</strong> -- admin assigns random 0-9 digits to rows/columns</p></li><li><p><strong>Enter scores</strong> -- quarterly score input</p></li><li><p><strong>Winner detection</strong> -- last digit of each team&#8217;s score maps to the grid</p></li><li><p><strong>Confetti</strong> -- <code>canvas-confetti</code> because details matter and it took 15 minutes</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gXF2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gXF2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gXF2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gXF2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gXF2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gXF2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg" width="945" height="2048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2048,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:174509,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://shodhan.substack.com/i/188687766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gXF2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gXF2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gXF2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gXF2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43674ab2-60a5-4220-9ba1-aaf27608d425_945x2048.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><h2><strong>Day 5: Social Features (Friday)</strong></h2><p><strong>Shipped:</strong> Photo gallery with uploads + likes, expense splitter, party tools</p><p>Photo gallery uses Supabase Storage with an admin approval workflow. Like counts update via database triggers -- no application-level counter management.</p><p>The expense splitter tracks who bought what for the party and calculates settlements. Not glamorous, but the friend who bought $200 of wings absolutely wants a Venmo breakdown.</p><div><hr></div><h2><strong>Day 6: Live Game Mode + Admin (Saturday)</strong></h2><p><strong>Shipped:</strong> Synchronized live trivia, admin dashboard, game state machine</p><p>This is where the app shifts from &#8220;async daily trivia&#8221; to &#8220;everyone in the room sees the same question.&#8221; The game state machine:</p><pre><code><code>pre_game &#8594; daily &#8594; live &#8594; ended
</code></code></pre><p>An admin dashboard controls question progression, pause/resume (halftime), and mode transitions. We poll every 2-3 seconds for game state instead of WebSocket because <strong>Vercel&#8217;s serverless model makes polling the path of least resistance,</strong> and 3-second latency is fine for trivia.</p><p>The admin panel also logs every action for an audit trail -- essential when someone disputes a score after three beers.</p><div><hr></div><h2><strong>Day 7: Polish + Ship (Sunday)</strong></h2><p><strong>Shipped:</strong> Error tracking, PWA service worker, confetti, avatars, edge cases</p><p>Morning was bug fixes and the error tracking system (client + server loggers with breadcrumbs). Afternoon was the stuff that makes it feel finished: 12 avatar options, streak animations, responsive layout testing on 6 different phone sizes.</p><p>Deployed to Vercel. Shared the URL. Done.</p><p></p><h2><strong>Game Day: Hotfixing from the Couch</strong></h2><p>Here&#8217;s a story they don&#8217;t put in the sprint retrospective.</p><p>It&#8217;s Super Bowl Sunday. Kickoff is 3:30 PM. Thirty friends are at the party, phones out, claiming squares on the board we&#8217;d built that same morning. The energy is perfect -- people are tapping cells, picking emojis, trash-talking about which numbers they&#8217;ll get.</p><p>Then someone messages me: <strong>&#8220;It says I hit the max. I can only pick 5 squares?&#8221;</strong></p><p>I&#8217;d set <code>max_squares_per_player</code> to 5 when I created the game. Seemed reasonable at the time. What I hadn&#8217;t accounted for: with 30 people and a 100-square board, some folks wanted 8 or 10. And there was no admin control to change the limit after game creation. The setting was baked in at create time. To change it, you&#8217;d have to delete the game and start over -- losing everyone&#8217;s claimed squares.</p><p>The national anthem is playing. I&#8217;m on my couch. My laptop is across the room. But I have the <strong>Claude mobile app</strong> on my phone.</p><p>I opened Claude, described the problem: <em>&#8220;I need a PATCH endpoint for /api/squares/settings that lets the game creator update max_squares_per_player on an open game. Validate 1-100 or null for unlimited. Also add an inline input to admin-controls.tsx so I can change it from the admin panel.&#8221;</em></p><p>Claude wrote the entire fix: a new API route with authorization checks, input validation, audit logging, and the admin UI component with a number input and save button. Three files, 163 lines of code. I reviewed it on my phone screen, merged <a href="https://github.com/sshodhan/FanTrivia/pull/72">PR #72</a>, and Vercel auto-deployed.</p><p><strong>Merged at 3:54 PM. First quarter hadn&#8217;t started yet.</strong></p><p>I bumped the limit to 10, told everyone to refresh, and went back to watching the game. Nobody at the party knew anything had happened. That&#8217;s the thing about shipping fixes with AI -- the gap between &#8220;we have a problem&#8221; and &#8220;it&#8217;s deployed&#8221; collapsed from hours to minutes.</p><p>The commit message reads: <code>feat: add max squares per player admin control for Super Bowl Squares</code>. It was authored by Claude, reviewed on a phone, and deployed before the opening kickoff. That&#8217;s the 2026 developer experience.</p><div><hr></div><h2><strong>The Cheat Codes (What Made 7 Days Possible)</strong></h2><h3><strong>1. AI as a Force Multiplier, Not a Crutch</strong></h3><p>Let&#8217;s be specific about what the AI tools actually did:</p><p><strong>v0.dev</strong> generated initial UI layouts for 9 different screens. It&#8217;s excellent at &#8220;give me a card grid with these fields&#8221; or &#8220;build a settings page with these controls.&#8221; The output isn&#8217;t production-ready -- you&#8217;ll refactor naming, tighten types, adjust layouts -- but it gets you from blank file to 70% done in minutes instead of hours. That&#8217;s 9 screens where I skipped the &#8220;stare at an empty editor&#8221; phase.</p><p><strong>Claude Code</strong> handled entire feature branches: writing API routes, database queries, React components, and TypeScript types across multiple files in a single pass. The expense splitter, admin controls, trivia category system, and Squares game logic all started as Claude Code branches that got reviewed and merged. It&#8217;s like having a junior developer who&#8217;s incredibly fast, never gets tired, and doesn&#8217;t mind being told to redo things.</p><p>The workflow: <strong>I architected. AI drafted. I reviewed and shipped.</strong> The creative and product decisions were mine. The typing was mostly not.</p><h3><strong>2. 57 Shadcn Components = A Design System in One CLI Command</strong></h3><pre><code>npx shadcn-ui@latest add button dialog card input form ...</code></pre><p>57 accessible, composable, Tailwind-styled components. No building a button from scratch. No debugging focus trapping in modals. No accessibility audits on dropdown menus. The Shadcn &#8220;new-york&#8221; style gave the whole app visual cohesion without a single Figma file.</p><p><strong>Hours saved: ~20+.</strong> That&#8217;s nearly 3 full days of the timeline just on UI primitives. Instead, those hours went into game logic and the features that actually make FanTrivia unique.</p><h3><strong>3. Supabase = Database + Auth + Storage + Realtime in One Dependency</strong></h3><p>We didn&#8217;t evaluate 4 services. We picked one that handled Postgres, Row Level Security, file storage, and real-time subscriptions. The <code>supabase-js</code> client talks to all of them.</p><h3><strong>4. Next.js API Routes = No Separate Backend</strong></h3><p>Every endpoint lives in <code>/app/api/</code>. Same repo. Same deploy. Same TypeScript types shared between frontend and backend. Zero CORS configuration.</p><h3><strong>5. JSONB for Evolving Features</strong></h3><p>The Squares game, player stats, and game settings all use JSONB columns. When requirements changed mid-week (they always do), we added keys instead of migrations.</p><h3><strong>6. Saying &#8220;No&#8221; Aggressively</strong></h3><p>No password auth. No native app. No custom design system. No microservices. No WebSocket where polling works. Every &#8220;no&#8221; bought hours.</p><div><hr></div><h2><strong>By the Numbers</strong></h2><p><strong>MetricValue</strong>Development time7 daysDevelopers1 (+ AI)Trivia questions97+Categories15API routes20+Reused UI components (Shadcn)57v0.dev-generated screens9Claude Code feature branches15+Database tables10Lines of SQL schema475Time to first question~8 secondsPasswords required0App store approvals0</p><div><hr></div><h2><strong>What We&#8217;d Do With a Day 8</strong></h2><p><strong>Tests.</strong> Schema validation exists, but there&#8217;s no integration test suite. For a one-week app, this was the right trade-off. For anything longer-lived, we&#8217;d test every API route against Supabase&#8217;s local dev stack.</p><p><strong>Push notifications.</strong> The service worker is registered but push isn&#8217;t wired up. &#8220;New category unlocked!&#8221; would have bumped daily returns.</p><p><strong>WebSocket for live mode only.</strong> Polling works. But during the actual Super Bowl, true push would shave 1-2 seconds off question reveals. Worth it for that one use case.</p><div><hr></div><h2><strong>The Takeaway</strong></h2><p>The 2026 solo-developer stack is unreasonably effective. Here&#8217;s the layer cake:</p><ol><li><p><strong>Infrastructure layer:</strong> Supabase + Vercel = database, auth, storage, hosting. Zero ops.</p></li><li><p><strong>UI layer:</strong> Shadcn/ui = 57 accessible components. Zero design system work.</p></li><li><p><strong>Prototyping layer:</strong> v0.dev = screen layouts from natural language. Zero blank-file paralysis.</p></li><li><p><strong>Implementation layer:</strong> Claude Code = full feature branches from architecture descriptions. Zero boilerplate typing.</p></li><li><p><strong>Product layer:</strong> You. The decisions about what to build, what to skip, and what makes it fun.</p></li></ol><p>The AI tools didn&#8217;t replace the developer. They replaced the tedious parts of development -- the parts where you already know what you want but haven&#8217;t typed it yet. What&#8217;s left is the creative work: product decisions, architecture trade-offs, and the details that make people smile (like confetti when you win a square).</p><p><strong>You don&#8217;t need a team. You need taste, the right stack, and the discipline to say &#8220;no&#8221; to everything that doesn&#8217;t ship.</strong></p><div><hr></div><p><em>Built with Next.js 16, React 19, Supabase, TypeScript, 57 Shadcn components, Tailwind CSS, FingerprintJS, SWR, Socket.io, canvas-confetti, v0.dev, Claude Code, and one very long week and fixing while watching the superbowl.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://shodhan.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading saral&#8217;s Substack! 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[AURA Stylist Agent]]></title><description><![CDATA[Excited to share what we&#8217;ve been building: AURA &#8212; an AI-powered personal fashion stylist.]]></description><link>https://shodhan.substack.com/p/aura-stylist-agent</link><guid isPermaLink="false">https://shodhan.substack.com/p/aura-stylist-agent</guid><dc:creator><![CDATA[motivatedpanda]]></dc:creator><pubDate>Sat, 21 Feb 2026 04:29:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5frw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde9e3c7-1d1d-4af3-b785-9c5f16faff6a_908x1848.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><p><strong>Excited to share what we&#8217;ve been building: AURA &#8212; an AI-powered personal fashion stylist.</strong></p><p>AURA (Adaptive Universal Reasoning Agent) takes real-time weather data, your style preferences, and occasion context to generate personalized outfit recommendations &#8212; complete with AI-generated visuals from three camera angles and cinematic runway videos.</p><p>Here&#8217;s what makes it tick:</p><p>&#128313; Weather-aware outfit reasoning powered by Google Gemini 2.0 Flash </p><p>&#128313; 3-angle AI image generation (standing, seated, walking) for every outfit </p><p>&#128313; 6-second cinematic runway videos via Google Veo 3.1 </p><p>&#128313; A signal precedence engine that balances occasion (40%), constraints (30%), vibes (20%), and persona (10%) </p><p>&#128313; 8 style personas &#8212; from Casual to Street Style &#8212; each with intelligent cache isolation </p><p>&#128313; Mood boards to save and curate your favorite looks </p><p>&#128313; Built with Next.js 16, React 19, TypeScript, and Tailwind CSS v4</p><p>From weather APIs to AI image generation to video synthesis &#8212; it&#8217;s been a challenging and rewarding build.</p><p>Try it out: </p><p>https://v0-aura-stylis-agent.vercel.app</p><p>#AI #FashionTech #GenerativeAI #GoogleGemini #NextJS #WebDevelopment #MachineLearning</p><p></p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bde9e3c7-1d1d-4af3-b785-9c5f16faff6a_908x1848.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82d35f7f-bb34-46db-bb86-67d6d91143a5_866x1856.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bd3e738-1867-4306-b396-776cffc4a51e_850x1856.png&quot;}],&quot;caption&quot;:&quot;&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/156d9e6e-c0b1-47dd-bb8f-dda01c32f365_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;8f4c48f7-d078-491c-a815-9a16dfc9191d&quot;,&quot;duration&quot;:null}"></div><p></p>]]></content:encoded></item><item><title><![CDATA[ Building Math Magic for My 10-Year-Old]]></title><description><![CDATA[How Vercel + AI Help Me Personalize Learning]]></description><link>https://shodhan.substack.com/p/building-math-magic-for-my-10-year</link><guid isPermaLink="false">https://shodhan.substack.com/p/building-math-magic-for-my-10-year</guid><dc:creator><![CDATA[motivatedpanda]]></dc:creator><pubDate>Sat, 13 Dec 2025 22:05:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GznU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Try It Out: https://sshodhan.vercel.app/</p><p><strong>Building Math Magic for My 10-Year-Old: </strong>Math Magic started when my 10-year-old daughter told me math felt like &#8220;a wall of text.&#8221; I wanted her&#8212;and every kid who learns visually&#8212;to have a coach that turns practice into progress with bright visuals, gentle nudges, and rewards that feel like play. Vercel made it possible to ship AI-powered, personalized experiences quickly and keep everything buttery-smooth on every screen, especially phones. Building it also showed me how approachable AI coding can be when fast previews and performance are handled for you.</p><p><strong>Learning First: What I Set Out to Solve</strong> Most platforms push static questions and generic hints. Kids need a learning buddy that adapts: remembers their pace, shows where they&#8217;re growing, and keeps curiosity alive&#8212;particularly on mobile where they learn and play. My daughter was my first tester; if it didn&#8217;t feel welcoming on her phone, it wasn&#8217;t done.</p><p><strong>Approach &amp; Technical Considerations</strong> I rely on Next.js and Vercel for fast iteration&#8212;preview links for every branch mean I can tweak a mobile flow, animation, or avatar border over lunch and share it with my daughter&#8217;s teachers before dinner. Edge-ready infra keeps the AI coach responsive without me babysitting servers. I also lean on task-specific AI support: Codex to scaffold tricky code or refactors and Claude to draft structured content or copy, which helps me ship each part of the app faster.</p><p><strong>How the AI Coach Teaches </strong></p><ul><li><p><strong>Adaptive practice:</strong> OpenAI + Next.js on Vercel serve problems that grow with each child. Mobile screens show large tap targets, color-coded steps, and instant &#8220;why this matters&#8221; bubbles so my daughter can follow along without getting overwhelmed.</p></li><li><p><strong>In-the-moment guidance:</strong> The coach stays inside the question context&#8212;showing clue bubbles, pointing at the next best step, or highlighting the attempt that&#8217;s closest to correct instead of handing over an answer.</p></li><li><p><strong>Clue-based confidence:</strong> When she&#8217;s stuck, the coach offers bite-sized hints, examples, or visuals (number lines, fraction markers, arrows) before revealing a full explanation, so she can feel the win herself.</p></li></ul><p><strong>Favorite Learning Moments</strong></p><ul><li><p>Watching my daughter tackle long division on my phone while the puzzle pieces animated smoothly&#8212;no lag thanks to edge caching.</p></li><li><p>Using preview deployments to test two mobile hint styles with her teacher in one afternoon.</p></li><li><p>Hearing her explain <em>why</em> a fraction step worked because the AI coach highlighted her own attempt&#8212;then seeing her avatar update instantly as a reward.</p></li></ul><p><strong>Challenges &amp; What I Learned</strong> AI agents sometimes get stuck fixing the same bug on repeat. When that happens, I take the reins: add targeted logs, break the problem into smaller steps, and ask the AI to solve one specific piece at a time. Guiding the agent with narrower prompts keeps the loop moving and the fixes reliable.</p><p><strong>How to Try Math Magic</strong> It&#8217;s live and mobile-ready&#8212;open https://sshodhan.vercel.app/</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GznU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GznU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png 424w, https://substackcdn.com/image/fetch/$s_!GznU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png 848w, https://substackcdn.com/image/fetch/$s_!GznU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png 1272w, https://substackcdn.com/image/fetch/$s_!GznU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GznU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png" width="1080" height="2400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2400,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:822081,&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://shodhan.substack.com/i/181544809?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.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_!GznU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png 424w, https://substackcdn.com/image/fetch/$s_!GznU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png 848w, https://substackcdn.com/image/fetch/$s_!GznU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png 1272w, https://substackcdn.com/image/fetch/$s_!GznU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56aa9147-258b-4652-b14e-e91c308bcabd_1080x2400.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> on your phone or laptop. Create an account to get starter stars, pick an avatar, and test the AI coach with a few practice sets; streaks, rewards, and the activity feed show up immediately so kids can see their progress in one session.</p><p><strong>What&#8217;s Inside (and the quick stats)</strong></p><ul><li><p><strong>AI Coach:</strong> GPT-4 powered, context-aware, kid-safe, and tuned for explainers that show <em>how they&#8217;re improving</em>.</p></li><li><p><strong>Reward Economy:</strong> Stars for performance, bonus stars for mastery, streaks up to 50 stars with a day-7 mystery box.</p></li><li><p><strong>Avatar System:</strong> Unlimited creations with 7 art styles and 30+ items (outfits, backgrounds, grid styles).</p></li><li><p><strong>Visual Math Tools:</strong> Number lines, fraction distance visuals, and step-by-step long division views designed first for mobile.</p></li><li><p><strong>Levels &amp; Feedback:</strong> 10 progressive levels per activity and AI feedback tuned for mobile readability; 100 starter stars for new accounts.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://shodhan.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading saral&#8217;s Substack! 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[Math Majic : Personalizing learning with vibe coding ]]></title><description><![CDATA[&#127775; Building Math Majic: Helping My 10-Year-Old See Math]]></description><link>https://shodhan.substack.com/p/math-majic-personalizing-learning</link><guid isPermaLink="false">https://shodhan.substack.com/p/math-majic-personalizing-learning</guid><dc:creator><![CDATA[motivatedpanda]]></dc:creator><pubDate>Mon, 10 Nov 2025 03:48:04 GMT</pubDate><enclosure url="insert-image-url-here" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div><hr></div><h1>&#127775; Building <em>Math Majic</em>: Helping My 10-Year-Old <em>See</em> Math</h1><a class="image-link image2" target="_blank" href="insert-image-url-here" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw"><img src="insert-image-url-here" data-attrs="{&quot;src&quot;:&quot;insert-image-url-here&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;App home screen or logo&quot;,&quot;title&quot;:&quot;Math Majic Home Screen&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="App home screen or logo" title="Math Majic Home Screen" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><div><hr></div><h3>The Spark &#10024;</h3><p>One evening I sat next to my 10-year-old as she worked through fractions and decimals. She followed every step &#8212; but the numbers stayed flat on the page.</p><blockquote><p>Growing up, I learned by <em>doing.</em> When I could <em>see</em> things in my head &#8212; how pieces fit into a whole, how numbers moved or scaled &#8212; learning clicked.</p></blockquote><p>That realization hit me hard: kids don&#8217;t just need math explained; they need to <em>visualize</em> it.</p><p>With tools like <strong>Vercel</strong>, I realized I could actually build something fast &#8212; a <strong>math coach</strong> tailored to each child&#8217;s needs, one that teaches the way kids <em>actually learn</em>: with visuals, feedback, and play.</p><p>So I began building <strong>Math Majic</strong> &#8212; a kid-friendly math coach with bright visuals, expressive avatars, and interactive challenges that make learning fun.</p><a class="image-link image2" target="_blank" href="insert-image-url-here" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw"><img src="insert-image-url-here" data-attrs="{&quot;src&quot;:&quot;insert-image-url-here&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;Learning screen showing place-value blocks or number line&quot;,&quot;title&quot;:&quot;Visual Learning Screen&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Learning screen showing place-value blocks or number line" title="Visual Learning Screen" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><div><hr></div><h3>The Experiment &#128300;</h3><p>What if math practice could feel more like an <em>adventure game</em> than a worksheet?</p><p>That&#8217;s how <strong>Math Majic</strong> was born &#8212; a playful learning experience where kids unlock puzzles, earn stars, and design avatars as they explore concepts like:</p><ul><li><p><strong>Number Sense</strong> &#8212; compare numbers on an interactive number line, understand magnitude through moving dots, and grasp place value visually.</p></li><li><p><strong>Long Division</strong> &#8212; step-by-step problems with animated guidance and instant visual feedback.</p></li><li><p><strong>Decimals</strong> &#8212; practice operations with color-coded grids, rounding, and visual comparisons.</p></li><li><p><strong>Math Coach (AI Chat)</strong> &#8212; powered by GPT-4, offering conversational help, hints, and encouragement in kid-friendly language.</p></li></ul><p>Each night, I&#8217;d test new ideas with my daughter. If something didn&#8217;t make sense, we redesigned it &#8212; until math <em>looked</em> like something she could touch and play with.</p><a class="image-link image2" target="_blank" href="insert-image-url-here" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw"><img src="insert-image-url-here" data-attrs="{&quot;src&quot;:&quot;insert-image-url-here&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;Lesson screen showing fraction tiles or decimal grid&quot;,&quot;title&quot;:&quot;Fraction or Decimal Grid&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Lesson screen showing fraction tiles or decimal grid" title="Fraction or Decimal Grid" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><div><hr></div><h3>What&#8217;s Inside the App &#129513;</h3><p>Version 1.1.0 adds a new <strong>Multi-Avatar System</strong>, so every learner can create and switch between their own math explorer characters.</p><p>Core learning and play features include:</p><ul><li><p><strong>Interactive learning modules</strong> &#8212; visualized exercises for Number Sense, Long Division, and Decimals.</p></li><li><p><strong>Gamified progression</strong> &#8212; 10 levels per topic with puzzles that reveal new images as you advance.</p></li><li><p><strong>Star Reward System</strong> &#8212; earn and spend stars on new outfits and accessories.</p></li><li><p><strong>Collections &amp; Store</strong> &#8212; a mini economy of rewards, with daily bonuses and achievements.</p></li><li><p><strong>Advanced Avatar Studio</strong> &#8212; design your character with 7 art styles, color palettes, and real-time previews.</p></li><li><p><strong>Activity Feed</strong> &#8212; see puzzles solved, avatars created, and milestones celebrated in one playful timeline.</p></li><li><p><strong>Safe AI Coach</strong> &#8212; provides hints, feedback, and math help in a friendly tone, filtered for kids.</p></li></ul><a class="image-link image2" target="_blank" href="insert-image-url-here" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw"><img src="insert-image-url-here" data-attrs="{&quot;src&quot;:&quot;insert-image-url-here&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;Avatar collection or reward screen&quot;,&quot;title&quot;:&quot;Avatar Rewards&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Avatar collection or reward screen" title="Avatar Rewards" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><div><hr></div><h3>Why It Matters &#128161;</h3><p>Building <em>Math Majic</em> reminded me why I love creating products: the best ones solve personal problems with empathy and curiosity.</p><blockquote><p>Watching a child light up when a decimal finally <em>clicks</em> &#8212; when they <em>see</em> that 0.4 is four-tenths of a grid &#8212; is the real reward.</p></blockquote><p><em>Math Majic</em> accelerates learning by combining <em>visual intuition</em>, <em>play</em>, and <em>positive feedback.</em> Kids learn faster when they can explore, experiment, and celebrate progress &#8212; not just memorize rules.</p><div><hr></div><h3>The Age of Builders and Tinkerers &#9881;&#65039;</h3><p>We&#8217;re entering a new era where one person can build and ship a product that helps real people learn &#8212; without needing a large team or complex infrastructure.</p><p>Platforms like <strong>Vercel</strong> make this possible. They&#8217;ve unlocked the <strong>age of builders and tinkerers</strong>, where creativity and code meet imagination.</p><blockquote><p>The gap between &#8220;idea&#8221; and &#8220;impact&#8221; has never been smaller.</p></blockquote><p>With Vercel&#8217;s developer-first platform, I could prototype, deploy, and iterate quickly &#8212; turning an idea born at the kitchen table into a fully working coach for kids. And that&#8217;s the beauty of this new age: <em>parents, teachers, and creators everywhere can now build tools that help the next generation learn better.</em></p><div><hr></div><h3>What&#8217;s Next &#128640;</h3><p>Here&#8217;s what&#8217;s coming soon in <em>Math Majic</em>:</p><ul><li><p>Multiplication and Fractions modules</p></li><li><p>Parent dashboard for progress tracking</p></li><li><p>Achievements and badges system</p></li><li><p>Offline mode and printable worksheets</p></li><li><p>More art styles (watercolor, pixel, anime)</p></li><li><p>Privacy-friendly leaderboards</p></li></ul><p>If you&#8217;re a parent, teacher, or edtech enthusiast who believes learning should be joyful, I&#8217;d love your feedback.</p><p>&#128073; <strong>Try it here:</strong> <a href="https://sshodhan.vercel.app/?utm_source=substack">https://sshodhan.vercel.app/</a></p><p>And if you&#8217;d like to follow along, subscribe &#8212; I&#8217;ll share behind-the-scenes progress, new visuals, and lessons learned while building <em>Math Majic.</em></p><div><hr></div><h3>Behind the Scenes &#128295;</h3><p><em>(optional visual section)</em></p><ul><li><p>Home screen &#8212; Number Sense, Long Division, Decimals modules</p></li><li><p>Interactive puzzles &#8212; draggable fractions and place-value blocks</p></li><li><p>Avatar Bazaar &#8212; hats, shoes, sparkles, and accessories</p></li></ul><a class="image-link image2" target="_blank" href="insert-image-url-here" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw"><img src="insert-image-url-here" data-attrs="{&quot;src&quot;:&quot;insert-image-url-here&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;Collage of app screens &#8211; Home / Lesson / Rewards / Settings&quot;,&quot;title&quot;:&quot;App Collage&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Collage of app screens &#8211; Home / Lesson / Rewards / Settings" title="App Collage" srcset="insert-image-url-here 424w, insert-image-url-here 848w, insert-image-url-here 1272w, insert-image-url-here 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><div><hr></div><p><strong>Math Majic</strong> is still evolving, but the mission stays simple:</p><blockquote><p>Help kids <em>see</em> what they&#8217;re learning &#8212; and accelerate their growth through curiosity, creativity, and play.</p></blockquote><div><hr></div><p></p>]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[This is saral&#8217;s Substack.]]></description><link>https://shodhan.substack.com/p/coming-soon</link><guid isPermaLink="false">https://shodhan.substack.com/p/coming-soon</guid><dc:creator><![CDATA[motivatedpanda]]></dc:creator><pubDate>Wed, 29 Mar 2023 17:56:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WftI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8681913e-0d4a-4541-bb97-4e247257ccf2_2048x1365.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is saral&#8217;s Substack.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://shodhan.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://shodhan.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>