<?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[Ju Data Engineering Newsletter]]></title><description><![CDATA[Each week, I explore and write about the latest tools and best practices for building data platforms.]]></description><link>https://juhache.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!Ev6t!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png</url><title>Ju Data Engineering Newsletter</title><link>https://juhache.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 13 Jun 2026 15:12:23 GMT</lastBuildDate><atom:link href="https://juhache.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Ju Hache]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[juhache@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[juhache@substack.com]]></itunes:email><itunes:name><![CDATA[Julien Hurault]]></itunes:name></itunes:owner><itunes:author><![CDATA[Julien Hurault]]></itunes:author><googleplay:owner><![CDATA[juhache@substack.com]]></googleplay:owner><googleplay:email><![CDATA[juhache@substack.com]]></googleplay:email><googleplay:author><![CDATA[Julien Hurault]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Launching Boring UI]]></title><description><![CDATA[A Newcomer in the Boring Constellation]]></description><link>https://juhache.substack.com/p/launching-boring-ui</link><guid isPermaLink="false">https://juhache.substack.com/p/launching-boring-ui</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Thu, 28 May 2026 13:40:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2407442e-0e13-494d-9db5-883c60af290d_1286x1348.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;m happy to announce the launch of my latest boring product :)</p><p>After:</p><ul><li><p><a href="https://github.com/boringdata/boring-catalog">boring catalog</a>: open source iceberg catalog</p></li><li><p><a href="https://www.boringdata.io/">boring data</a>: Terraform data stack templates</p></li><li><p><a href="https://github.com/boringdata/boring-semantic-layer">boring semantic layer</a>: open source semantic layer</p></li></ul><p>Welcome <strong><a href="https://github.com/hachej/boring-ui">Boring UI</a></strong> to the boring galaxy: an open source framework for shipping agent-centric apps.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FYr8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FYr8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png 424w, https://substackcdn.com/image/fetch/$s_!FYr8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png 848w, https://substackcdn.com/image/fetch/$s_!FYr8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png 1272w, https://substackcdn.com/image/fetch/$s_!FYr8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FYr8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png" width="1456" height="546" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:546,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Boring UI &#8212; bring your agent skills, get a UI&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Boring UI &#8212; bring your agent skills, get a UI" title="Boring UI &#8212; bring your agent skills, get a UI" srcset="https://substackcdn.com/image/fetch/$s_!FYr8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png 424w, https://substackcdn.com/image/fetch/$s_!FYr8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png 848w, https://substackcdn.com/image/fetch/$s_!FYr8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.png 1272w, https://substackcdn.com/image/fetch/$s_!FYr8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b96a16-81c0-4ce2-a9ba-fbcab5d61984_3840x1440.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><div class="pullquote"><div class="callout-block" data-callout="true"><p>If you like the project, it would really help to star the repo &#11088;</p><p>I&#8217;m a bootstrapped solo developer with limited resources, and every star helps the project gain visibility and credibility :)</p><p>Thank you !</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/hachej/boring-ui&quot;,&quot;text&quot;:&quot;Github&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/hachej/boring-ui"><span>Github</span></a></p></div></div><h1>The Why </h1><p>Since the beginning of the year, I&#8217;ve spent a lot of time digging into the agent space.</p><p>AI can now understand user intent and act on it. And that completely changes how we build tools and interfaces.</p><p>For the first time, interfaces can become truly minimal and &#8220;boring&#8221;.</p><p>Boring because the interface can just be reduced to just two things:</p><ul><li><p>an agent chat on the left</p></li><li><p>a workspace on the right (~ mini IDE)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QeZI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QeZI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png 424w, https://substackcdn.com/image/fetch/$s_!QeZI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png 848w, https://substackcdn.com/image/fetch/$s_!QeZI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png 1272w, https://substackcdn.com/image/fetch/$s_!QeZI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QeZI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png" width="686" height="420.2692307692308" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:892,&quot;width&quot;:1456,&quot;resizeWidth&quot;:686,&quot;bytes&quot;:475247,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!QeZI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png 424w, https://substackcdn.com/image/fetch/$s_!QeZI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png 848w, https://substackcdn.com/image/fetch/$s_!QeZI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.png 1272w, https://substackcdn.com/image/fetch/$s_!QeZI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5905ee3-907f-400e-8f90-36738da3c244_1750x1072.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></li></ul><p>I&#8217;ve already started seeing this pattern emerge across multiple products, and I think it&#8217;s slowly becoming the standard way to build software.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7lbe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7lbe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png 424w, https://substackcdn.com/image/fetch/$s_!7lbe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png 848w, https://substackcdn.com/image/fetch/$s_!7lbe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png 1272w, https://substackcdn.com/image/fetch/$s_!7lbe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7lbe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png" width="623" height="579.967032967033" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1186,&quot;width&quot;:1274,&quot;resizeWidth&quot;:623,&quot;bytes&quot;:1050184,&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://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.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_!7lbe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png 424w, https://substackcdn.com/image/fetch/$s_!7lbe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png 848w, https://substackcdn.com/image/fetch/$s_!7lbe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.png 1272w, https://substackcdn.com/image/fetch/$s_!7lbe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84000cfa-d1b0-45ec-bd28-84fe46a23e3e_1274x1186.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>Boring UI provides the foundation for building these kinds of agent-centric applications: a unified agent + workspace model that can adapt to virtually any use case.</p><p>I wrote about this back in February, when I shared the three things I believed would bring the most value in the AI era. One of them was &#8220;IDE for X.&#8221;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;42834b59-efbc-4f2e-90c9-7ebb58b02318&quot;,&quot;caption&quot;:&quot;Bonjour!&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;If AI Writes the Code, Where&#8217;s the Edge?&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-12T13:02:55.076Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3c17172-1ac2-43db-ae69-f687d4c53b0b_684x748.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/if-ai-writes-the-code-wheres-the&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:187057374,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:8,&quot;comment_count&quot;:4,&quot;publication_id&quot;:1211981,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Ev6t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>After many iterations, Boring UI became the expression of that vision:</p><p>A simple (and boring) web-based mini IDE that lets anyone leverage the power of coding agents &#8230; without needing to interact with code directly.</p><p>You can see it in action here:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;5e8af882-a821-42c7-8339-481df1fbceb7&quot;,&quot;duration&quot;:null}"></div><h1>Try it</h1><p>Boring UI is designed for building hosted agent-centric apps.</p><p>But it also runs fully locally: no auth, no database, no setup complexity.</p><p>Just a stateless agent + workspace running directly on your machine.</p><p>To get started:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;eda751fd-bbd7-45f3-ae5e-62ce9b47e2c4&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">export OPENAI_API_KEY=
npx @hachej/boring-ui-cli</code></pre></div><p>Boring UI uses Pi as the agent harness (more on this in the next section), so you simply need to configure LLM access through environment variables (<code>ANTHROPIC_API_KEY</code>, <code>OPENAI_API_KEY</code>) or via a pi <a href="https://pi.dev/docs/latest/providers">LLM provider</a>.</p><p>Once configured, you instantly get a UI + agent connected to the folder where you launched the CLI.</p><p>Pi and therfore Boring UI is provider-agnostic and does not lock you into a specific model vendor. You can use virtually any LLM:</p><ul><li><p>commercial APIs</p></li><li><p>open-source models</p></li><li><p>fully self-hosted LLM infrastructure</p></li></ul><p>Yes, this means you can plug in your Codex Pro plan (though not your Anthropic Max plan).</p><h1>Build on PI</h1><p>When building Boring UI, I was heavily inspired by the <a href="https://pi.dev/">Pi</a> project.</p><p>It&#8217;s an open-source agent harness that is super lightweight and built to be highly extensible.</p><p>I also really connected with the vision and philosophy of its creator <a href="https://mariozechner.at/">Mario Zechner</a>, which pushed me to adopt Pi as the core harness behind Boring UI.</p><div id="youtube2-RjfbvDXpFls" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;RjfbvDXpFls&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/RjfbvDXpFls?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>I won&#8217;t go too deep into the technical details, but I wanted to give a quick overview of how Boring UI is structured.</p><p>At a high level, the system is organized around four main components:</p><ul><li><p><strong>Web Frontend</strong> &#8594; chat + workspace UI</p></li><li><p><strong>Web Backend</strong> &#8594; API layer shared by both the frontend and the agent tools</p></li><li><p><strong>Pi Harness</strong> &#8594; agent runtime</p></li><li><p><strong>Sandbox</strong> &#8594; isolated filesystem + execution runtime</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_!IJgJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IJgJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png 424w, https://substackcdn.com/image/fetch/$s_!IJgJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png 848w, https://substackcdn.com/image/fetch/$s_!IJgJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png 1272w, https://substackcdn.com/image/fetch/$s_!IJgJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IJgJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png" width="527" height="338.67937853107344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1416,&quot;resizeWidth&quot;:527,&quot;bytes&quot;:146946,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!IJgJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png 424w, https://substackcdn.com/image/fetch/$s_!IJgJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png 848w, https://substackcdn.com/image/fetch/$s_!IJgJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.png 1272w, https://substackcdn.com/image/fetch/$s_!IJgJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63e06506-dfdc-4b27-b77c-3eabfa9957d9_1416x910.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>One important design axiom I had from the beginning was that the agent and the user should interact with the same core primitives through the same interfaces.</p><p>For example, there is a single file API shared by both:</p><ul><li><p>the frontend file tree</p></li><li><p>the agent filesystem tools</p></li></ul><p>The same applies to the UI itself: the agent sees the workspace the same way the user does and can interact with it through dedicated UI tools.</p><p>Using Pi made this architecture possible because I could integrate it directly into my backend through its Node.js SDK, while still being able to deeply customize its tools and interfaces.</p><p>For example, I was able to override the filesystem tools so they interact with the sandbox system configured by Boring UI.</p><p>Currently, Boring UI supports the following sandbox isolations:</p><ul><li><p>local and 0 isolation :) </p></li><li><p>local with <code>bwrap</code></p></li><li><p>remote Vercel sandboxes</p></li></ul><p>And soon more: Kube, Bedrock AgentCore etc</p><h1>Extensible: Boring Plugins</h1><p>One of Pi&#8217;s biggest strengths is its extensibility.</p><p>Anyone can publish a package to extend Pi with custom prompts, skills, and tools.</p><p>I wanted Boring UI to fully leverage that ecosystem instead of reinventing it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!25MU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!25MU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png 424w, https://substackcdn.com/image/fetch/$s_!25MU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png 848w, https://substackcdn.com/image/fetch/$s_!25MU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png 1272w, https://substackcdn.com/image/fetch/$s_!25MU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!25MU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png" width="1456" height="584" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:584,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:484613,&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://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.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_!25MU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png 424w, https://substackcdn.com/image/fetch/$s_!25MU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png 848w, https://substackcdn.com/image/fetch/$s_!25MU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.png 1272w, https://substackcdn.com/image/fetch/$s_!25MU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb0dfc83-ab3a-440c-a7b2-9a6cbbbca1b6_2880x1156.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>So rather than creating yet another plugin model, Boring UI simply extends the one Pi already provides.</p><p>Pi plugins focus on the agent layer:</p><ul><li><p>prompts</p></li><li><p>skills</p></li><li><p>tools</p></li><li><p>slash commands</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xFrQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xFrQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png 424w, https://substackcdn.com/image/fetch/$s_!xFrQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png 848w, https://substackcdn.com/image/fetch/$s_!xFrQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png 1272w, https://substackcdn.com/image/fetch/$s_!xFrQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xFrQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png" width="587" height="276.5673076923077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:686,&quot;width&quot;:1456,&quot;resizeWidth&quot;:587,&quot;bytes&quot;:233321,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!xFrQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png 424w, https://substackcdn.com/image/fetch/$s_!xFrQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png 848w, https://substackcdn.com/image/fetch/$s_!xFrQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.png 1272w, https://substackcdn.com/image/fetch/$s_!xFrQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9442a188-b778-4676-bce5-76ff57ca7529_1490x702.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></li></ul><p>Boring UI adds a UI layer on top of them with concepts such as:</p><ul><li><p>panels</p></li><li><p>command palette actions</p></li><li><p>UI events</p></li><li><p>catalogs</p></li></ul><p>The two layers are fully compatible: any Pi plugin works out of the box inside Boring UI.</p><p>In practice, a plugin is simply a Node package with two manifest blocks:</p><ul><li><p><code>pi.*</code> &#8594; agent side: prompts, skills, tools</p></li><li><p><code>boring.*</code> &#8594; UI side: panels, commands, catalogs, surface resolvers</p></li></ul><p>Example of <code>package.json</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;92557c57-9e7e-4568-a108-def161cde589&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">{
  "name": "my-plugin",
  "keywords": ["pi-package"],
  "pi": {
    "extensions": ["agent/index.ts"],
    "skills": ["agent/skills"],
    "prompts": ["agent/prompts"],
    "systemPrompt": "Short agent guidance."
  },
  "boring": {
    "label": "My Plugin",
    "front": "front/index.tsx",
    "server": "server/index.ts"
  }
}</code></pre></div><p>This makes customization extremely flexible.</p><p>You can install any existing Pi plugin directly to customize the agent&#8217;s behavior.</p><p>And if needed, you can progressively enhance that same plugin with Boring UI capabilities like custom panels, commands, or interactive UI surfaces.</p><p>Plugins also compose naturally: multiple plugins can coexist side by side, or shared primitives can be wrapped into reusable packages.</p><p>I already have a few plugins in the repository:</p><ul><li><p><a href="https://github.com/hachej/boring-ui/tree/main/plugins/ask-user">ask-user</a> &#8594;  Agent-to-human Q&amp;A with a UI prompt </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_!7nW8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7nW8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png 424w, https://substackcdn.com/image/fetch/$s_!7nW8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png 848w, https://substackcdn.com/image/fetch/$s_!7nW8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png 1272w, https://substackcdn.com/image/fetch/$s_!7nW8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7nW8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png" width="446" height="345.7973568281938" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:704,&quot;width&quot;:908,&quot;resizeWidth&quot;:446,&quot;bytes&quot;:87683,&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://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.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_!7nW8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png 424w, https://substackcdn.com/image/fetch/$s_!7nW8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png 848w, https://substackcdn.com/image/fetch/$s_!7nW8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.png 1272w, https://substackcdn.com/image/fetch/$s_!7nW8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0e00a14-e9bd-485d-9c28-b2fa245d42e5_908x704.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><ul><li><p><a href="https://github.com/hachej/boring-ui/tree/main/plugins/data-catalog">data-catalog</a> &#8594; Catalog tab built on data-explorer</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_!FRgM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FRgM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png 424w, https://substackcdn.com/image/fetch/$s_!FRgM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png 848w, https://substackcdn.com/image/fetch/$s_!FRgM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png 1272w, https://substackcdn.com/image/fetch/$s_!FRgM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FRgM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png" width="206" height="311.1914893617021" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:710,&quot;width&quot;:470,&quot;resizeWidth&quot;:206,&quot;bytes&quot;:154987,&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://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.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_!FRgM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png 424w, https://substackcdn.com/image/fetch/$s_!FRgM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png 848w, https://substackcdn.com/image/fetch/$s_!FRgM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.png 1272w, https://substackcdn.com/image/fetch/$s_!FRgM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b14125-ef2b-4355-8686-b8edd9548a11_470x710.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><ul><li><p><a href="https://github.com/hachej/boring-ui/tree/main/plugins/deck">deck</a> &#8594; Plugin to let the agent create html slide deck.</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_!z3Hg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z3Hg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png 424w, https://substackcdn.com/image/fetch/$s_!z3Hg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png 848w, https://substackcdn.com/image/fetch/$s_!z3Hg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png 1272w, https://substackcdn.com/image/fetch/$s_!z3Hg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z3Hg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png" width="434" height="467.2142857142857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:844,&quot;width&quot;:784,&quot;resizeWidth&quot;:434,&quot;bytes&quot;:209889,&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://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.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_!z3Hg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png 424w, https://substackcdn.com/image/fetch/$s_!z3Hg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png 848w, https://substackcdn.com/image/fetch/$s_!z3Hg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.png 1272w, https://substackcdn.com/image/fetch/$s_!z3Hg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a05ffe-82c8-4656-b059-92e9e2a09ca9_784x844.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>Install them in your Boring UI project and you instantly get those capabilities.</p><p>I have 10s of ideas for plugins that could emerge from this model:</p><ul><li><p>Kanban boards</p></li><li><p>LLM-powered wikis / second brains</p></li><li><p>orchestration interfaces</p></li><li><p>observability dashboards</p></li><li><p>workflow builders</p></li><li><p>openclaw like daemon</p></li></ul><h1>Built with boring-ui</h1><p>To demonstrate the power of this setup, I built a first custom app: <strong><a href="https://getmacroanalyst.com/">boring-macro</a></strong>.</p><p>It&#8217;s an agent for macroeconomic research.</p><p><em>Note: the app is invitation-only for now, mainly because I haven&#8217;t implemented billing yet.</em></p><p>The agent has access to economic series like GDP, employment rates, prices, and more. </p><p>It can explore data, perform ad hoc transformations, visualize series, and even generate slide decks.</p><p>What&#8217;s interesting is that the entire app is implemented as a single Boring UI plugin.</p><p>Under the hood, the plugin includes:</p><ul><li><p>a custom skill to guide the agent&#8217;s behavior</p></li><li><p>a custom SQL tool to query macroeconomic data</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!00eI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!00eI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png 424w, https://substackcdn.com/image/fetch/$s_!00eI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png 848w, https://substackcdn.com/image/fetch/$s_!00eI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png 1272w, https://substackcdn.com/image/fetch/$s_!00eI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!00eI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png" width="503" height="307.8111263736264" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:891,&quot;width&quot;:1456,&quot;resizeWidth&quot;:503,&quot;bytes&quot;:388140,&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://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.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_!00eI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png 424w, https://substackcdn.com/image/fetch/$s_!00eI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png 848w, https://substackcdn.com/image/fetch/$s_!00eI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.png 1272w, https://substackcdn.com/image/fetch/$s_!00eI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd86f295f-b8fe-4d15-9f6b-e481a3421863_2920x1786.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></li><li><p>a custom component to explore visualize time series in the workspace</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_!KQlZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KQlZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png 424w, https://substackcdn.com/image/fetch/$s_!KQlZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png 848w, https://substackcdn.com/image/fetch/$s_!KQlZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png 1272w, https://substackcdn.com/image/fetch/$s_!KQlZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KQlZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png" width="505" height="436.6723901098901" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1259,&quot;width&quot;:1456,&quot;resizeWidth&quot;:505,&quot;bytes&quot;:498599,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!KQlZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png 424w, https://substackcdn.com/image/fetch/$s_!KQlZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png 848w, https://substackcdn.com/image/fetch/$s_!KQlZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.png 1272w, https://substackcdn.com/image/fetch/$s_!KQlZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcff5b4c8-cd10-4b16-b145-b498dc6f55fa_2072x1792.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><ul><li><p>a custom CLI + SDK to help the agent generate Python transformations of time series</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wEVX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wEVX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png 424w, https://substackcdn.com/image/fetch/$s_!wEVX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png 848w, https://substackcdn.com/image/fetch/$s_!wEVX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png 1272w, https://substackcdn.com/image/fetch/$s_!wEVX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wEVX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png" width="504" height="171" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:494,&quot;width&quot;:1456,&quot;resizeWidth&quot;:504,&quot;bytes&quot;:76652,&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://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.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_!wEVX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png 424w, https://substackcdn.com/image/fetch/$s_!wEVX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png 848w, https://substackcdn.com/image/fetch/$s_!wEVX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png 1272w, https://substackcdn.com/image/fetch/$s_!wEVX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12007445-cac9-4416-8f38-416e300ba0b6_1604x544.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!60SG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!60SG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png 424w, https://substackcdn.com/image/fetch/$s_!60SG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png 848w, https://substackcdn.com/image/fetch/$s_!60SG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png 1272w, https://substackcdn.com/image/fetch/$s_!60SG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!60SG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png" width="501" height="482.76304945054943" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1403,&quot;width&quot;:1456,&quot;resizeWidth&quot;:501,&quot;bytes&quot;:392090,&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://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.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_!60SG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png 424w, https://substackcdn.com/image/fetch/$s_!60SG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png 848w, https://substackcdn.com/image/fetch/$s_!60SG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.png 1272w, https://substackcdn.com/image/fetch/$s_!60SG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F786509ca-dd1f-4d28-96a8-e04c52deaa75_1654x1594.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></li><li><p>the deck plugin to render HTML slide decks in the workspace</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_!3mnC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3mnC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png 424w, https://substackcdn.com/image/fetch/$s_!3mnC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png 848w, https://substackcdn.com/image/fetch/$s_!3mnC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png 1272w, https://substackcdn.com/image/fetch/$s_!3mnC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3mnC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png" width="500" height="454.6703296703297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1324,&quot;width&quot;:1456,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:270891,&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://juhache.substack.com/i/199431893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.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_!3mnC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png 424w, https://substackcdn.com/image/fetch/$s_!3mnC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png 848w, https://substackcdn.com/image/fetch/$s_!3mnC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.png 1272w, https://substackcdn.com/image/fetch/$s_!3mnC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6081558f-455b-4b89-95da-9b9ff4ab39a5_1980x1800.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 think it&#8217;s a good illustration of how far you can go with this model: from data access, to analysis, to visualization, to presentation generation&#8230; </p><h1>THE next feature: hot reload</h1><p>The next feature I&#8217;m excited about is self-buildable UI.</p><p>If the agent already has filesystem access, there&#8217;s no reason it shouldn&#8217;t build its own plugins.</p><p>Users could start from a few UI primitives and let the agent create custom skills and panes tailored to their workflows.</p><p>That&#8217;s exciting because it makes apps even more boring: you ship primitives, the agent handles the last-mile customization.</p><p>Right now, plugins are loaded at build time and only reloadable in development.</p><p>I&#8217;m working on dynamic hot-reloading inside the app so agents can eventually create and evolve their own UI surfaces in real time.</p><p>Demo of the agent creating and editing a csv viewer plugin:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;cf81d9bf-c4a1-4a09-89df-6bdb765d27dc&quot;,&quot;duration&quot;:null}"></div><h1>Vision</h1><p>This is still the initial version of Boring UI, and the project is actively evolving.</p><p>I already use Boring UI internally for many things in my company:</p><ul><li><p>accounting </p></li><li><p>project: md report edition</p></li><li><p>coding: agent plans review</p></li></ul><p>It&#8217;s just so much nicer to have a clean, unified UI instead of a collection of TUIs scattered across terminal sessions.</p><p>Long term, I imagine Boring UI evolving into a skill-sharing platform.</p><p>A place where domain experts can share skills, UI primitives, workflows, and packaged knowledge.</p><p>It&#8217;s still early.</p><p>But I&#8217;m genuinely very excited about where this can go.</p><div><hr></div><p>I hope you&#8217;re as excited about this project as I am :)</p><p>Again, if you like the project, it would really help to star the repo &#11088;. </p><p>I&#8217;m building this project independently, and every star makes a huge difference.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/hachej/boring-ui&quot;,&quot;text&quot;:&quot;Github&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://github.com/hachej/boring-ui"><span>Github</span></a></p><p>The possibility of shipping custom agents in a matter of days with Boring UI opens the door to many kinds of collaborations.</p><p>I&#8217;m actively looking to work with:</p><ul><li><p>companies interested in deploying custom internal agents </p></li><li><p>domain experts interested in partnering to build vertical agent-native apps together</p></li></ul><p>If that sounds interesting, feel free to reach out.</p><div><hr></div><p>Thanks for reading,</p><p>- Ju</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Time for AI Coding to Turn Boring ? ]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 101]]></description><link>https://juhache.substack.com/p/time-for-ai-coding-to-turn-boring</link><guid isPermaLink="false">https://juhache.substack.com/p/time-for-ai-coding-to-turn-boring</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Wed, 20 May 2026 09:00:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!szx0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3c3b5cb-395e-4ee3-a387-d2ab3db9f4c9_1426x796.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I started 2026 by writing a Boring Engineer Manifesto.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;97d835d7-0423-46f6-92e3-7e639dd7b3bf&quot;,&quot;caption&quot;:&quot;Bonjour!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The Boring Engineer Manifesto&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-01-09T12:31:21.009Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c24e022-dff9-4ef0-a3c9-3ace51dadcab_894x516.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/boring-engineering-manifesto&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:183649097,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:40,&quot;comment_count&quot;:1,&quot;publication_id&quot;:1211981,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Ev6t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>I write this post with the need to somehow put on paper the intuition I have built over the last few years.</p><p>Five months later, I feel the same need again &#8212; but this time focused on AI coding workflows.</p><p>Every week brings new models, new tools, new trends, and new CEO hot takes.</p><p>Reflecting on the last few months, this feels a lot like the dynamical systems courses I had at university.</p><p>An initial state.</p><p>A perturbation.</p><p>And then a convergence toward a new stable equilibrium with wide back-and-forth swings in between.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1_ua!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1_ua!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif 424w, https://substackcdn.com/image/fetch/$s_!1_ua!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif 848w, https://substackcdn.com/image/fetch/$s_!1_ua!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif 1272w, https://substackcdn.com/image/fetch/$s_!1_ua!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1_ua!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif" width="1456" height="815" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:815,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:744634,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/197858434?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1_ua!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif 424w, https://substackcdn.com/image/fetch/$s_!1_ua!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif 848w, https://substackcdn.com/image/fetch/$s_!1_ua!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif 1272w, https://substackcdn.com/image/fetch/$s_!1_ua!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e35f70a-cdb8-4f80-9d38-84c4776c379d_2800x1568.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This post is a brain dump of everything I&#8217;ve learned about the topic over the last few months.</p><p>Where I see things starting to converge.</p><p>Maybe the premise of a boring AI coding workflow ? Finally.</p><blockquote><p><em>Note: This post is not AI-generated. I wrote it manually and only used a single prompt to edit it:</em></p><p>&#8220;<em>Correct grammar: &lt;&gt; </em>&#8221; :)</p></blockquote><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>No baby sitting</h1><p>This was my first step this year: getting the most out of a single agent session.</p><p>To do that, I had to stop babysitting the agent.</p><p>No more permissions prompts.</p><p>No more letting my laptop running.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KoNl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KoNl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KoNl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KoNl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KoNl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KoNl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg" width="172" height="259.48275862068965" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:525,&quot;width&quot;:348,&quot;resizeWidth&quot;:172,&quot;bytes&quot;:64288,&quot;alt&quot;:&quot;AI Coders Walk Around in Public With Laptops Open to Keep Agents Going -  Business Insider&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Coders Walk Around in Public With Laptops Open to Keep Agents Going -  Business Insider" title="AI Coders Walk Around in Public With Laptops Open to Keep Agents Going -  Business Insider" srcset="https://substackcdn.com/image/fetch/$s_!KoNl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KoNl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KoNl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KoNl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe18ba571-fe3e-4c51-ab4e-0bbba206ce21_348x525.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>I now rent a VPS on OVHcloud and run all my work from there. </p><p>My agents run there continuously in all persmission mode. </p><p>I just use a <a href="https://github.com/Dicklesworthstone/destructive_command_guard">tool</a> that spots dangeroud command and block them.</p><p>And this works perfectly: agents don&#8217;t get interrupted and keep running until they finish their tasks.</p><h1>No Agent Swarms</h1><p>I got caught up in the agent swarm hype at the beginning of the year.</p><p>It was definitely the opposite of &#8220;boring&#8221; &#8212; but still worth exploring.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;e6dab163-b565-4e49-bb6c-d1ea178fdc8d&quot;,&quot;caption&quot;:&quot;I wrote about my agent workflow struggles in last week&#8217;s newsletter:&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;On the Road to Agent Swarms&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-01-23T22:22:23.312Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69f93c26-03ce-4928-ba9e-5b5284fa4558_714x886.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/on-the-road-to-agent-swarms&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:185535368,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:17,&quot;comment_count&quot;:6,&quot;publication_id&quot;:1211981,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Ev6t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>I tested various tools and workflows, but I eventually came to the following conclusion:</p><p>Writing the code was not the bottleneck for me anymore.</p><p>The real bottleneck was being able to provide enough spec, context, and direction to properly feed the machine.</p><p>And once I realized that, the whole premise of agent swarms started to break down for my use case.</p><p>Building a swarm of agents makes little sense if I can&#8217;t reliably feed it.</p><h1>Plan Plan Plan </h1><p>I learned this the hard way.</p><p>If you don&#8217;t feed the machine correctly, agents still aren&#8217;t good enough to build reliable software consistently.</p><p>They tend to overcomplicate things, over-engineer solutions, take shortcuts, and drift away from the original intent.</p><p>A common way to overcome this is to:</p><ul><li><p>have good guardrails in <code>AGENTS.md</code></p></li><li><p>spend time writing a good plan</p></li></ul><p>Usually, that&#8217;s enough to constrain the model and get good results.</p><p>But I find that writing plans is not that easy.</p><p>Super detailed plans start to feel like writing the code directly&#8230;</p><p>Vague plans lead to disasters.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qiwm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qiwm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png 424w, https://substackcdn.com/image/fetch/$s_!qiwm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png 848w, https://substackcdn.com/image/fetch/$s_!qiwm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png 1272w, https://substackcdn.com/image/fetch/$s_!qiwm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qiwm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png" width="1456" height="882" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:882,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:349856,&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://juhache.substack.com/i/197858434?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.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_!qiwm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png 424w, https://substackcdn.com/image/fetch/$s_!qiwm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png 848w, https://substackcdn.com/image/fetch/$s_!qiwm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png 1272w, https://substackcdn.com/image/fetch/$s_!qiwm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9122b40e-85f8-498b-b8f5-ef27152a1f9b_1714x1038.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.youtube.com/watch?v=rmvDxxNubIg&amp;t=1s">source</a></figcaption></figure></div><p>Building the intuition for what to constrain and what not to constrain is probably the real craft now.</p><p>Engineering craft is now:</p><ol><li><p>Finding the right plan at the right level of abstraction</p></li><li><p>Knowing what to put in the plan &#8212; which means knowing what you actually want</p></li></ol><h1>&#8230; And review</h1><p>I built some advanced review workflows where several agents using different models review each other&#8217;s code.</p><p>It worked pretty well &#8212; especially when asking Codex to review Claude-generated code.</p><p>But as they both lack common sense I still need to review things manually.</p><p>I review the overall shape of the code and the details of the most important sections, not every single line.</p><p>And that&#8217;s part of the craft as well:</p><p>Choosing what to review, and at which level of detail.</p><p>To do that well, you need to understand your infrastructure, your codebase, and the tradeoffs inside it.</p><p>There is no way around.</p><h1>Up-Skilling </h1><p>This has been a real aha moment for me over the last month: agent skills.</p><p>When they&#8217;re well written, they can convey an enormous amount of value for very specific tasks.</p><p>The skill I&#8217;ve been the most impressed with is <a href="https://impeccable.style/">impeccable</a> for design. It produces much better designs than a raw model alone.</p><p>Personally, every time I do something that I may need later, I try to turn it into a skill.</p><p>All my skills are version-controlled in a repo, and I have a simple dispatch script that copies them into <code>~/.agents/skills</code> on my machines.</p><p>But there&#8217;s a real danger with this approach: each skill is referenced in the harness system prompt.</p><p>So if you accumulate dozens of skills in <code>~/.agents</code>, you end up polluting the context on every turn, which degrades the quality of the output.</p><p>So I&#8217;m very careful about what actually gets dispatched globally, and I try to isolate skills to specific projects as much as possible.</p><h1>OSS to save us</h1><h3>OSS models </h3><p>Like many developpers after couple months of subusised hoony moon, I have started to get nervous about my dependainy to claude code.</p><p>I started playing with OSS models and honestly, I&#8217;ve been more than impressed.</p><p>I now run Qwen 3.6 on my Mac M3 and use it for all kinds of tasks: research, testing, and bug fixing.</p><p>When you run your own model, it feels like entering a new world of freedom.</p><p>No &#8220;x% of quota remaining&#8221; warnings.</p><p>No strange feeling of giving my data away.</p><p>Just my Mac sweating next to me :)</p><p>Note: this is the setup I <a href="https://www.reddit.com/r/LocalLLaMA/comments/1stjwg5/been_using_pi_coding_agent_with_local_qwen36_35b/">used</a>.</p><h2>OSS harnesses</h2><p>The same lock-in concerns I mentioned about models also pushed me to look for alternatives to Claude Code itself.</p><p>That&#8217;s where <a href="https://pi.dev/">Pi</a> started to get really interesting.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zu4D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zu4D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png 424w, https://substackcdn.com/image/fetch/$s_!Zu4D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png 848w, https://substackcdn.com/image/fetch/$s_!Zu4D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png 1272w, https://substackcdn.com/image/fetch/$s_!Zu4D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zu4D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png" width="583" height="326.6580152671756" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:734,&quot;width&quot;:1310,&quot;resizeWidth&quot;:583,&quot;bytes&quot;:226375,&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://juhache.substack.com/i/197858434?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.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_!Zu4D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png 424w, https://substackcdn.com/image/fetch/$s_!Zu4D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png 848w, https://substackcdn.com/image/fetch/$s_!Zu4D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.png 1272w, https://substackcdn.com/image/fetch/$s_!Zu4D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5da44f1b-6b63-42fd-8d3f-5af4b07c8dec_1310x734.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>It&#8217;s a super lightweight harness designed to be extensible through plugins.</p><p>The community is incredibly productive, and almost all the features you find in Claude Code or Codex are already available through plugins.</p><p>Most importantly: it works with almost every provider.</p><p>Except one: Claude Max Plan :)</p><p>I&#8217;ve been using it for the last few weeks, and I&#8217;m honestly super satisfied.</p><p>My model usage has naturally gravitated toward a wider diversity of models:</p><ul><li><p>GPT-5.5 (Pro Plan) for coding</p></li><li><p>DeepSeek 1.4 via OpenRouter for coding</p></li><li><p>Qwen 3.6 via Tailscale (running on my Mac) or OpenRouter for general tasks + simple coding</p></li><li><p>Gemini 3.1 for reviewing</p></li><li><p>Grok for reviewing</p></li></ul><p>Having a single multi-LLM harness makes it incredibly easy to mix models together.</p><p>One plugin I use a lot is the <a href="https://github.com/nicobailon/pi-subagents">subagent plugin.</a> It lets you combine reviews from multiple models within the same session. And honestly, it works very well.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qmV8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qmV8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.png 424w, https://substackcdn.com/image/fetch/$s_!qmV8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.png 848w, https://substackcdn.com/image/fetch/$s_!qmV8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.png 1272w, https://substackcdn.com/image/fetch/$s_!qmV8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qmV8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.png" width="495" height="393.00824175824175" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d91bf196-494b-4901-842f-eaded60f3824_1698x1348.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1156,&quot;width&quot;:1456,&quot;resizeWidth&quot;:495,&quot;bytes&quot;:1054981,&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://juhache.substack.com/i/197858434?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.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_!qmV8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.png 424w, https://substackcdn.com/image/fetch/$s_!qmV8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.png 848w, https://substackcdn.com/image/fetch/$s_!qmV8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.png 1272w, https://substackcdn.com/image/fetch/$s_!qmV8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd91bf196-494b-4901-842f-eaded60f3824_1698x1348.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><h1>Resisting the tool tsunami</h1><p>For the rest, I avoid spending too much time testing every new tool popping up in my feed.</p><p>My reasoning is simple:</p><p>If a tool is truly good, it will eventually get implemented into the harnesses like Claude Code, Codex, or Pi.</p><p>The time I&#8217;d lose setting it up, integrating it, and maintaining it usually isn&#8217;t worth it.</p><p>I couldn&#8217;t resist, however, playing with the OpenClaw wave: especially to automate some admin work for my company.</p><p>I made the classic mistake: I spent time setting it up, it broke many times, and the whole thing became a distraction.</p><p> Eventually, I just passed:</p><ul><li><p>the OpenClaw GitHub repo</p></li><li><p>the Hermes GitHub repo</p></li><li><p>the Pi GitHub repo</p></li></ul><p>&#8230;to my agents, and I one-shotted my own minimal &#8220;boring-claw&#8221; setup that perfectly fits my needs: one Slack channel per project, each connected to a pi session running on my VPS.</p><p>It has now been running for weeks and has required almost zero maintenance and reduced security risk.. </p><div><hr></div><p>This is everything I&#8217;ve learned over the past few months.</p><p>The convergence is probably temporary, but writing this has helped me measure how much things have evolved in such a short time.</p><p>I hope you got something out of this.</p><p>Do not hesitate to respond to this email with your experience. </p><p>Or, even better, share it publicly in the comments.</p><p>Thanks for reading,</p><p>Ju</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"></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[The 10x Data Team = The Markdown Team]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 101]]></description><link>https://juhache.substack.com/p/the-10x-data-team-the-markdown-team</link><guid isPermaLink="false">https://juhache.substack.com/p/the-10x-data-team-the-markdown-team</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Fri, 24 Apr 2026 09:33:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e4183fcd-e25f-4518-9b7b-d33671eb6c49_1964x1158.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I&#8217;m Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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">&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p>LLMs have made intelligence on-demand. </p><p>Not as a service you build. As a capability you embed.</p><p>Intelligence used to live in the code your team wrote: a dashboard, a pipeline, a report. </p><p>Now this intelligence can write code everywhere: on your users&#8217; machines, inside your pipelines, inside your orchestrators.</p><p>For data teams in 2026 and beyond, this raises a new question: If agents can code, what will we build?</p><p>Welcome to the Markdown Team.</p><h1>Reimagining the Data Team</h1><p>LLMs keep improving with every release. </p><p>At the same time, every data tool provider is rushing to become agent-native.</p><p>Put those two trends together, and a new possibility emerges:</p><blockquote><p>with the right context and guardrails, agents may soon be able to write production-grade pipeline code reliably enough.</p></blockquote><p>Not perfectly today.</p><p>Not in every case yet.</p><p>But soon enough that data teams should already be paying attention.</p><p>So if that becomes true, what happens to the way data teams work?</p><h3>The Old Equilibrium</h3><p>Today, the data team owns the entire pipeline.</p><p>Marketing asks for a dashboard. The data team writes the SQL, models it in dbt, and builds the dashboard. Two weeks later, it is ready.</p><p>Product asks, &#8220;What is our churn rate?&#8221; The data team writes the query, runs it, and sends back the answer. Until then, users wait.</p><p>The pattern is simple:</p><p><strong>Data team pushes:</strong> gold tables, metrics, dashboards<br><strong>Users pull:</strong> answers from those dashboards</p><h3>The New Equilibrium</h3><p>Now take the assumption seriously: agents can generate code reliably when given the right context and guardrails.</p><p>If that holds, the equilibrium flips.</p><p>We can inject that intelligence for 2 things:</p><ul><li><p><strong>User side:</strong> turn core data assets into answers and insights on demand</p></li><li><p><strong>Pipeline side:</strong> build and adapt pipelines much faster as demand emerges</p></li></ul><p>So instead of the data team pushing a fixed set of dashboards and data products, users ask, and agents handle the last mile.</p><p>The new pattern looks like this:</p><p><strong>Data team pushes:</strong> rules and core artifacts<br><strong>Users ask</strong><br><strong>Agents execute</strong></p><p>The data team&#8217;s job is no longer to manually produce every dashboard, query, or pipeline.</p><p>It is to build the highway that makes agent execution safe.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ESMJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ESMJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ESMJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ESMJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ESMJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ESMJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg" width="467" height="116.48997772828508" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:112,&quot;width&quot;:449,&quot;resizeWidth&quot;:467,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;8 Safety Tips for Highway Driving ...&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="8 Safety Tips for Highway Driving ..." title="8 Safety Tips for Highway Driving ..." srcset="https://substackcdn.com/image/fetch/$s_!ESMJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ESMJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ESMJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ESMJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f9b104e-2bfb-4cf9-b1d0-f218ee9f8526_449x112.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h1>The New Jobs to Be Done</h1><h2>Job 1: Choose where to add determinism</h2><p>LLMs are great at generating code, but bad at predictable behavior.</p><p>So no, vibe-coding a data platform from scratch will not work.</p><p>The job of the data team becomes more strategic: decide where determinism is needed, put the right building blocks in place, and let LLMs generate code within those boundaries.</p><p>Even Anthropic seems to recognize this. In the leaked <a href="https://garymarcus.substack.com/p/the-biggest-advance-in-ai-since-the">Claude Code source code</a>, a tool call like <code>print.ts</code> is one big if-then conditional: hundreds of branch points, deeply nested, all inside a deterministic symbolic loop.</p><p>That is the right mental model: LLM for pattern matching + symbolic rules.</p><p>Fortunately, the data ecosystem is moving in that direction. </p><p>More and more tools are becoming agent-native and provide us with these reliable deterministic building blocks:</p><ul><li><p>dlt provides deterministic ingestion</p></li><li><p>dbt provides deterministic transformation</p></li><li><p>semantic layers provide deterministic metric querying</p></li></ul><p>That means the data team&#8217;s role is to select the right deterministic tools and define the rules that let LLMs combine them coherently.</p><p>Which, in many ways, is just platform engineering:</p><ul><li><p>choose the tools</p></li><li><p>define the architecture</p></li><li><p>enforce the governance</p></li><li><p>document the standards</p></li></ul><h2>Job 2: Context encoding</h2><p>This one is straightforward: LLMs fail when they do not understand the meaning of the data.</p><p>If a model does not know what a dataset represents, how the company operates, or what a metric actually means, it will make mistakes.</p><p>So the second role of the data team is to encode that context: gathering information from different sources, cleaning it, removing contradictions, and exposing it in a form that agents can reliably consume.</p><p>This context is not static and has to be shaped from both sides: from the company&#8217;s knowledge and structure, but also from observing how agents consume that context in practice.</p><p>That means analyzing agent failures and adapting definitions, documentation, and context structures to make the right things more explicit for the agent next time.</p><p>In that sense, context encoding is not just documentation work. It is an additional layer in the stack, one that needs its own feedback loops, maintenance, and tooling. </p><p>And a new category of tools is starting to emerge to support that context curation work &#8212; nao being one example.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:187334465,&quot;url&quot;:&quot;https://thenewaiorder.substack.com/p/data-teams-should-become-context&quot;,&quot;publication_id&quot;:4147498,&quot;publication_name&quot;:&quot;New AI Order&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Z0PQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e5936-103f-4c27-a3e7-24558a3cb966_516x516.png&quot;,&quot;title&quot;:&quot;Data teams should become context teams&quot;,&quot;truncated_body_text&quot;:&quot;Remember when your company connected their BI tool directly into the production database? Figures were always wrong. Nobody trusted the dashboards - so we built data stacks to fix that.&quot;,&quot;date&quot;:&quot;2026-02-09T08:13:16.373Z&quot;,&quot;like_count&quot;:31,&quot;comment_count&quot;:6,&quot;bylines&quot;:[{&quot;id&quot;:319206589,&quot;name&quot;:&quot;Claire Gouze&quot;,&quot;handle&quot;:&quot;thenewaiorder&quot;,&quot;previous_name&quot;:&quot;New AI Order&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab4098d5-b55f-403c-9ab8-2c2569faa087_856x856.jpeg&quot;,&quot;bio&quot;:&quot;Just another data-loving geek&quot;,&quot;profile_set_up_at&quot;:&quot;2025-02-18T09:32:12.307Z&quot;,&quot;reader_installed_at&quot;:null,&quot;publicationUsers&quot;:[{&quot;id&quot;:4229724,&quot;user_id&quot;:319206589,&quot;publication_id&quot;:4147498,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:true,&quot;publication&quot;:{&quot;id&quot;:4147498,&quot;name&quot;:&quot;New AI Order&quot;,&quot;subdomain&quot;:&quot;thenewaiorder&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Just another data-loving geek&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/879e5936-103f-4c27-a3e7-24558a3cb966_516x516.png&quot;,&quot;author_id&quot;:319206589,&quot;primary_user_id&quot;:319206589,&quot;theme_var_background_pop&quot;:&quot;#FF6719&quot;,&quot;created_at&quot;:&quot;2025-02-18T09:34:05.831Z&quot;,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;New AI Order&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false,&quot;logo_url_wide&quot;:null}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;status&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:null,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:null,&quot;paidPublicationIds&quot;:[],&quot;subscriber&quot;:null}}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;,&quot;source&quot;:null}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://thenewaiorder.substack.com/p/data-teams-should-become-context?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!Z0PQ!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e5936-103f-4c27-a3e7-24558a3cb966_516x516.png" loading="lazy"><span class="embedded-post-publication-name">New AI Order</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Data teams should become context teams</div></div><div class="embedded-post-body">Remember when your company connected their BI tool directly into the production database? Figures were always wrong. Nobody trusted the dashboards - so we built data stacks to fix that&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">4 months ago &#183; 31 likes &#183; 6 comments &#183; Claire Gouze</div></a></div><h2>Job 3: Kaizen</h2><p>This all sounds obvious in theory. The hard part is making it real.</p><p>The answer is the same as with any good data platform: iteration.</p><p>Start with a first version of the rules. Capture the platform design, the best practices you already know, and the pitfalls you have already seen. You can even ask an agent to inspect your current codebase and surface patterns.</p><p>Then let the agent build.</p><p>When it fails, look closely at why.</p><p>Because most failures are not syntax failures: agent are good at writing and debugging SQL/dbt/dlt etc code.</p><p>They are context failures: </p><p>A metric definition was unclear.<br>A table was less reliable than expected.<br>A join was much more expensive than it looked.<br>A business assumption was never written down.</p><p>That is the agent flywheel: every failure becomes a new rule, a new skill file, a new script, a new constraint.</p><p>Each iteration strengthens the system.<br>Each correction makes the agent safer.<br>Each new rule increases autonomy.</p><h2>The New Roles</h2><p>If agents can code, data roles move up the stack.</p><h2>Data engineer &#8594; platform architect</h2><p>The data engineer becomes a platform architect.</p><ul><li><p>platform design: tools, architecture, governance, monitoring</p></li><li><p>pipeline guardrails: what agents can and cannot do</p></li><li><p>cost governance</p></li></ul><p>You stop writing pipelines one by one.</p><p>Your job is to design the environment in which pipelines can be generated reliably.</p><h2>Data analyst &#8594; research analyst</h2><p>The data analyst becomes a research analyst.</p><p>You own:</p><ul><li><p>metric definitions and contracts</p></li><li><p>business-facing data documentation</p></li><li><p>deep-dive analysis: scenario modeling, simulations, and decision support</p></li></ul><p>That last point matters a lot.</p><p>If agents can answer most routine business questions, then the analyst&#8217;s role does not disappear. It shifts upward.</p><p>The analyst spends less time answering questions like &#8220;what happened?&#8221; and more time exploring questions like:</p><ul><li><p>what happens if we change pricing?</p></li><li><p>what happens if conversion drops in one segment but rises in another?</p></li><li><p>what happens if we shift budget across channels?</p></li></ul><p>In other words, the analyst moves from reporting to research.</p><div><hr></div><p>So this is my vision for the future of data teams.</p><p>No, we are not fully there yet.</p><p>But after a few months of intense interaction with AI, I think we are getting close enough that data teams should already be paying attention.</p><p>And yes, it changes a lot about our jobs.</p><p>Many of us got into this field because we love the technical craft: writing code, writing SQL, building things ourselves. </p><p>I think more of that will fade in the medium term.</p><p>Working in a data team may mean writing Markdown files and orchestrating agents all day long.</p><p>That shift can feel uncomfortable if what you love most is the craft.</p><p>But it also creates space for something bigger.</p><p>Data teams may become less execution-heavy, but far more strategic, influential, and embedded in decision-making.</p><p>And ultimately, more impactful for the business, which was the original goal all along.</p><div><hr></div><p>Thanks for reading,</p><p>Ju</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[I Let Claude Code Build ELT Connectors. Here’s What Happened.]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 100]]></description><link>https://juhache.substack.com/p/i-let-claude-code-build-elt-connectors</link><guid isPermaLink="false">https://juhache.substack.com/p/i-let-claude-code-build-elt-connectors</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Wed, 22 Apr 2026 11:47:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/10d11469-8e25-4f56-b1cf-107db0857ec5_1084x744.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Development workflows have shifted fast these last few months. </p><p>Coding agents now sit between us and our tools&#8212;and that changes how we judge the ecosystem.</p><p>In data ingestion, my old heuristic was simple:</p><ul><li><p>Managed for standard sources (Fivetran, Airbyte)</p></li><li><p>Python when you need flexibility (custom connectors)</p></li></ul><p>Fivetran has an SDK, but it always felt too heavy&#8212;until agents entered the picture.</p><p>If an agent can absorb the SDK complexity, even proprietary interfaces become usable.</p><p>That collapses the old ELT spectrum: managed (Fivetran) vs code-driven (dlt).</p><p>So I tested it: can the same coding agent build custom connectors for both&#8212;using the Fivetran SDK on one side and dlt on the other?</p><p>Same API. Same LLM. Same goal.</p><p>Let&#8217;s see what happens.</p><div class="pullquote"><p><em>Thanks to the Fivetran team for supporting this investigation.</em></p><p><em>Before writing this post, I didn&#8217;t realize Fivetran is fully self-serve: you can sign up and access the full product without a sales call.</em></p><p><em>Getting started takes only a few clicks, and there&#8217;s a 14-day free trial.</em></p><p><em>If you&#8217;d like to try it yourself, you can sign up here:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://go.fivetran.com/signups/data-without-overhead?utm_medium=paid_social&amp;utm_source=other&amp;utm_campaign=PLG-2026-Q1-Sponsored-Julien-Hurault&amp;utm_content=trial&amp;utm_term=default&quot;,&quot;text&quot;:&quot;Try Fivetran&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://go.fivetran.com/signups/data-without-overhead?utm_medium=paid_social&amp;utm_source=other&amp;utm_campaign=PLG-2026-Q1-Sponsored-Julien-Hurault&amp;utm_content=trial&amp;utm_term=default"><span>Try Fivetran</span></a></p></div><h1><strong>Designing the Nightmare API</strong></h1><p>AI copilots are a powerful tool for accelerating software development, and stand to commoditize (or even trivialize) data integration.</p><p>The goal of this post is simple: find the limits of AI-driven integration.</p><p>To test this properly, I built a virtual FastAPI server exposing three types of records:</p><ul><li><p>customers</p></li><li><p>orders</p></li><li><p>events</p></li></ul><h3><strong>Easy mode</strong></h3><p>In the &#8220;realistic&#8221; version, the API looks like a typical demo:</p><ul><li><p>Auth: Bearer token</p></li><li><p>Schema: consistent and complete</p></li><li><p>Pagination: cursor (customers), offset (orders), Link header (events)</p></li><li><p>Rate limiting: none</p></li></ul><p>Pretty standard.</p><h3><strong>Hard mode</strong></h3><p>Then I made it deliberately painful:</p><ul><li><p>Broken records: null IDs, evolving schemas, random extra fields</p></li><li><p>Type chaos: metadata as dict/str/list, amount as int/str/null</p></li><li><p>Deep nesting: JSON 7 levels deep</p></li><li><p>Auth upgrade: HMAC-SHA256 with X-Api-Key, X-Timestamp, X-Nonce, X-Signature</p></li><li><p>Rate limiting: 5 requests / 10s, 429 + Retry-After</p></li></ul><h3><strong>Protocol</strong></h3><p>The FastAPI server exposes a complete OpenAPI spec&#8212;schemas and auth included&#8212;so an agent has, in theory, everything it needs.</p><p>To compare dlt and Fivetran, I ran both locally and loaded the results into DuckDB.</p><p>dlt is Python-native, so local runs are the default. </p><p>Fivetran&#8217;s Connector SDK can also run fully locally, which keeps the comparison fair.</p><p>For each tool, I launched an isolated Claude Code agent (Opus 4.6), gave it a minimal prompt, and let it build the connector.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;279d5e71-1354-4769-91af-617646df1cb0&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Build a Fivetran connector for the Nightmare API Easy mode with incremental mode.

Setup:

- Create venv in this folder

- Create DuckDB file

Build:

- Read spec: http://localhost:8787/openapi.json

- Implement using &lt;fivetran-connector-sdk/dlt&gt;

- Load to DuckDB

- Iterate until working

- Write report
</code></pre></div><p>I simulated incremental loads by adding new records after the first run, then rerunning the exact same pipeline.</p><p>At the end of each scenario, a separate agent compared the two DuckDB databases and flagged any differences.</p><h1><strong>Results: Easy Mode</strong></h1><p>Both agents did great: end-to-end in ~3&#8211;4 minutes.</p><p>The first run succeeded for both tools.</p><p>On the second run, both behaved as expected: they loaded only new incremental records and even detected a duplicate.</p><p>So far, so good&#8212;but a few type differences showed up:</p><ul><li><p>Dates: dlt uses TIMESTAMP, Fivetran stores ISO 8601 strings as VARCHAR</p></li><li><p>Decimals: dlt uses DOUBLE, Fivetran uses DECIMAL</p></li></ul><h3><strong>Schema handling</strong></h3><p>Fivetran treats the OpenAPI spec as the contract: if a field exists (even optional), it creates the column&#8212;whether or not the API ever returns it.</p><p>dlt is schema-on-observation: it creates columns only for fields it actually sees in the payloads.</p><p>In our case, a few fields were marked optional in the spec but never appeared in actual responses.</p><p>Fivetran still created the corresponding columns (all NULL/empty), while dlt never created them because it never observed those fields in the data.</p><p>Nothing dramatic&#8212;just different philosophies.</p><p>A solid warm-up: easy for both tools.</p><p>Now let&#8217;s go up a level.</p><h1><strong>Results: Hard Mode</strong></h1><p>Hard mode introduced some real friction: NULL primary keys, deeply nested structures (7 levels), mixed data types, and HMAC authentication&#8212;across the same three endpoints (customers, orders, events), each serving 1,000 records.</p><p>Both agents handled HMAC auth and rate limiting easily.</p><p>The outcome:</p><ul><li><p>dlt: 3,000 / 3,000 records loaded (100%). Created 5 tables, including child tables for nested arrays.</p></li><li><p>Fivetran SDK: 2,815 / 3,000 records loaded (93.8%). 185 records dropped&#8212;all with NULL primary keys.</p></li></ul><p>Here&#8217;s what happened.</p><p>dlt failed once the broken records appeared. A schema inferred from the clean run broke when corrupted variants showed up&#8212;specifically metadata changing types. </p><p>The agent had to patch the pipeline by:</p><ul><li><p>adding variant handling for metadata</p></li><li><p>generating surrogate keys for NULL IDs</p></li></ul><p>Fivetran ran end-to-end without code changes. Its &#8220;serialize to VARCHAR/JSON&#8221; approach avoided type conflicts, and its strict primary-key requirement filtered out invalid records.</p><p>The trade-off: 185 records never landed.</p><h4><strong>Mixed Metadata Types</strong></h4><p>Orders returned metadata as a dict, a string, or an integer.</p><ul><li><p>dlt inferred a STRUCT from the first batch (all dicts). When strings/integers appeared later, the pipeline broke. After the agent fixed it, metadata was split into four columns: metadata__source, metadata__campaign, metadata__value (for non-dict values), and metadata__type (to track the variant).</p></li><li><p>Fivetran serialized metadata into a single VARCHAR JSON column, so it never broke&#8212;but you lose the typed structure.</p></li></ul><h4><strong>Nested Data</strong></h4><p>dlt flattened nested arrays into child tables&#8212;orders__line_items (2,534 rows) and events__tags (516 rows)&#8212;linked back to the parent via foreign keys.</p><p>Fivetran kept them inline by serializing the arrays as JSON strings in VARCHAR columns (_line_items_json, tags).</p><p>Both work, but the ergonomics differ: dlt is join-ready; Fivetran requires JSON parsing at query time (or an extra staging model).</p><p>Most of these edge cases could probably be handled with better prompting&#8212;and a bit more upfront guidance.</p><p>What&#8217;s interesting is how far you can get with a one-shot prompt, and how each framework&#8217;s defaults reveal its underlying philosophy.</p><p>In both cases, the agent navigated the tools smoothly and set up ingestion quickly. That&#8217;s what makes these tools compelling: they&#8217;re solid building blocks an agent can adapt for last-mile customization.</p><p>One more takeaway: maintenance. Agents aren&#8217;t just useful for bootstrapping pipelines&#8212;they can also keep them running. In this test, the agent diagnosed why the dlt pipeline failed after the first run and patched it into a more resilient shape.</p><h1><strong>Conclusion</strong></h1><p>ELT decisions traditionally come down to four things:</p><ol><li><p>Cost model &#8212; MAR vs compute</p></li><li><p>Engineering time &#8212; setup + maintenance</p></li><li><p>Connector catalog &#8212; what you get out of the box</p></li><li><p>Custom connectors &#8212; how painful it is to build what&#8217;s missing</p></li></ol><p>AI compresses #4 and a big chunk of #2.</p><p>Both dlt and the Fivetran SDK can get to a working custom connector fast, even against awkward APIs. </p><p>Once &#8220;can we build the connector?&#8221; stops being the differentiator, what matters most is the operating model:</p><ul><li><p>Fivetran SDK: your connector runs on Fivetran&#8217;s platform. You inherit hosting, scaling, scheduling, monitoring, retries, security, and general operational burden.</p></li><li><p>dlt: you get full Python flexibility, but you own the whole stack: runtime, orchestration, scaling, observability, and on-call.</p></li></ul><p>So the decision becomes a strategy choice.</p><p>For smaller teams (say, &lt;400 people) with limited ops bandwidth, no desire to own ingestion, and highly commodified data models, Fivetran is a sensible default.</p><p>If you need maximum flexibility and control, and you&#8217;re willing to invest in running and maintaining ingestion, dlt is the better fit.</p><div class="pullquote"><p style="text-align: center;"><em>Sign up here to try Fivetran with a 14-day free trial:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://go.fivetran.com/signups/data-without-overhead?utm_medium=paid_social&amp;utm_source=other&amp;utm_campaign=PLG-2026-Q1-Sponsored-Julien-Hurault&amp;utm_content=trial&amp;utm_term=default&quot;,&quot;text&quot;:&quot;Try Fivetran&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://go.fivetran.com/signups/data-without-overhead?utm_medium=paid_social&amp;utm_source=other&amp;utm_campaign=PLG-2026-Q1-Sponsored-Julien-Hurault&amp;utm_content=trial&amp;utm_term=default"><span>Try Fivetran</span></a></p></div><p>Thanks for reading,</p><p>Ju</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[How to Test Your Analytics Agent ?]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 99]]></description><link>https://juhache.substack.com/p/how-to-test-your-analytics-agent</link><guid isPermaLink="false">https://juhache.substack.com/p/how-to-test-your-analytics-agent</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Thu, 19 Mar 2026 10:45:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b8526deb-0df9-4dc8-8789-d2747a1e3570_1052x646.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I&#8217;m Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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">&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p>This is the fourth episode of our chat-BI series with nao.</p><p>Quick recap.</p><p><a href="https://thenewaiorder.substack.com/p/chat-bi-101-from-wild-horses-to-workhorse?r=l9wvi">Post 1</a>: We explored a modern approach to chat-BI, using the filesystem to store and serve context to the model.</p><p><a href="https://thenewaiorder.substack.com/p/sql-is-solved-heres-where-chat-bi?r=l9wvi">Post 2</a>: We stress-tested that setup on real benchmarks (BIRD + DABStep).</p><p><a href="https://thenewaiorder.substack.com/p/semantic-layer-map-for-chat-bi-agents?r=l9wvi">Post 3</a>: We reran those benchmarks with a semantic layer and showed how it reduces ambiguity.</p><p>In this post, I&#8217;ll deep dive into how nao tests an analytics agent.</p><p>The team has iterated a lot over the past few months and gathered some really interesting insights into what it takes to test agent frameworks.</p><p>Let&#8217;s go.</p><h1>Testing Agent != Testing SQL</h1><p>In the previous posts of this series, we ran chat-BI agents on real benchmarks.</p><p>We saw agents can fail&#8212;not because of bad SQL syntax, but because of misinterpretation:</p><ul><li><p>They misread metric definitions.</p></li><li><p>They answered questions that had no answer in the data.</p></li><li><p>They missed basic business conventions.</p></li></ul><p>If you want to reduce these errors, you need to measure them systematically.</p><p>The obvious solution is to compare SQL:</p><ol><li><p>Give it a prompt</p></li><li><p>Pick an expected SQL query</p></li><li><p>Compare the two</p></li></ol><p>But here&#8217;s the problem:</p><p>An agent can issue multiple queries, structure them differently (different CTEs, different aliases), or reach the same answer through different intermediate steps.</p><p>Sometimes it won&#8217;t even return SQL at all&#8212;it might return plain text, a table, or a chart.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!om8v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!om8v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png 424w, https://substackcdn.com/image/fetch/$s_!om8v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png 848w, https://substackcdn.com/image/fetch/$s_!om8v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png 1272w, https://substackcdn.com/image/fetch/$s_!om8v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!om8v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png" width="380" height="250.06451612903226" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:408,&quot;width&quot;:620,&quot;resizeWidth&quot;:380,&quot;bytes&quot;:27557,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thenewaiorder.substack.com/i/190607745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!om8v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png 424w, https://substackcdn.com/image/fetch/$s_!om8v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png 848w, https://substackcdn.com/image/fetch/$s_!om8v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.png 1272w, https://substackcdn.com/image/fetch/$s_!om8v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c77b25f-5328-43ea-b34a-5cf9a39a55a5_620x408.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>So the real challenge isn&#8217;t validating the process (&#8220;did it write my SQL?&#8221;).</p><p>It&#8217;s validating the outcome: did it get the right answer, while keeping the freedom to reason its own way?</p><h1>nao testing framework</h1><p>To support this non-deterministic agent behavior and still ship BI agents with real control, nao built its own testing framework.</p><p>The setup is simple.</p><p>You define test cases as small YAML files in a tests folder. Each file contains a name, a prompt, and a validation query (SQL) used to compute the expected result:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;363328b1-4976-4224-9fca-717943b1b97f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">name: total_revenue

prompt: What is the total revenue?

sql: SELECT SUM(amount) AS total_revenue FROM payments;</code></pre></div><p>That validation SQL is not there to compare against the agent&#8217;s SQL. It&#8217;s there to compute the golden result set.</p><p>You&#8217;re not testing &#8220;did you write this SQL?&#8221;</p><p>You&#8217;re testing &#8220;did your answer match this data?&#8221;</p><p>When you run <code>nao test,</code> here&#8217;s what happens:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1MDa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1MDa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png 424w, https://substackcdn.com/image/fetch/$s_!1MDa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png 848w, https://substackcdn.com/image/fetch/$s_!1MDa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png 1272w, https://substackcdn.com/image/fetch/$s_!1MDa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1MDa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png" width="414" height="539.3265306122449" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:766,&quot;width&quot;:588,&quot;resizeWidth&quot;:414,&quot;bytes&quot;:50111,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thenewaiorder.substack.com/i/190607745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!1MDa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png 424w, https://substackcdn.com/image/fetch/$s_!1MDa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png 848w, https://substackcdn.com/image/fetch/$s_!1MDa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.png 1272w, https://substackcdn.com/image/fetch/$s_!1MDa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa684b8de-ed4a-4bb9-b324-92f6ea8e3de4_588x766.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>nao sends each YAML test case to a specific LLM. Then it:</p><ol><li><p>collects the agent&#8217;s answer</p></li><li><p>normalizes it with a synthesizer (more on that below) which converts the answer into a structured list of records and sorts it consistently by rows and columns</p></li><li><p>compares it to the golden result produced by the validation SQL</p></li></ol><p>Furthermore, each run is logged as a single JSON artifact with everything you need to debug later: transcript, tool calls, SQL queries, intermediate outputs, and token usage.</p><p>Because this is standardized, you can scale evaluation easily across many test cases and across multiple LLM providers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PRmz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PRmz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png 424w, https://substackcdn.com/image/fetch/$s_!PRmz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png 848w, https://substackcdn.com/image/fetch/$s_!PRmz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png 1272w, https://substackcdn.com/image/fetch/$s_!PRmz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PRmz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png" width="1456" height="734" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:734,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:198596,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thenewaiorder.substack.com/i/190607745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!PRmz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png 424w, https://substackcdn.com/image/fetch/$s_!PRmz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png 848w, https://substackcdn.com/image/fetch/$s_!PRmz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.png 1272w, https://substackcdn.com/image/fetch/$s_!PRmz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18eb6f7c-6203-4a80-8092-82f681f987d9_2276x1148.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>A few details that matter:</p><ul><li><p>Runs are isolated: the agent does not know about how his answer will be evaluated</p></li><li><p>Concurrent execution: multiple models &#215; multiple tests can run in parallel.</p></li><li><p>Cost visibility: for some warehouses (e.g., BigQuery), nao can capture query cost in addition to token cost, so you can track the full cost of an agent run.</p></li></ul><h1>Synthesizer LLM</h1><p>This is where most people expect a simple SQL comparison.</p><p>nao does something different.</p><p>After the agent completes its full loop, nao takes the full conversation transcript and sends it to a second LLM: the synthesizer.</p><p>The synthesizer&#8217;s job is simple: extract the agent&#8217;s final answer into a structured format that matches the expected schema.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DhKO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DhKO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png 424w, https://substackcdn.com/image/fetch/$s_!DhKO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png 848w, https://substackcdn.com/image/fetch/$s_!DhKO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png 1272w, https://substackcdn.com/image/fetch/$s_!DhKO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DhKO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png" width="291" height="368.47798742138366" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1208,&quot;width&quot;:954,&quot;resizeWidth&quot;:291,&quot;bytes&quot;:81361,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thenewaiorder.substack.com/i/190607745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!DhKO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png 424w, https://substackcdn.com/image/fetch/$s_!DhKO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png 848w, https://substackcdn.com/image/fetch/$s_!DhKO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.png 1272w, https://substackcdn.com/image/fetch/$s_!DhKO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e793cb-112b-4267-9274-e6d0f59a83be_954x1208.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>Here&#8217;s the prompt it uses:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;77b6f852-b46f-4df8-a36f-8bd1fb3b303a&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Based on your previous analysis, provide the final answer to the original question.

Format the data with these columns: ${columns.join(&#8217;, &#8216;)}

Return the data as an array of rows, where each row is an object with the column names as keys.

If you cannot answer, set data to null.`;</code></pre></div><p>nao enforces this with structured output, so the synthesizer returns parsable JSON&#8212;not free-form text.</p><p>Why does this exist?</p><p>If you tell the agent upfront what output format you expect, you bias it.</p><p>So you need two isolated steps:</p><ol><li><p>let the agent run with zero knowledge of the expected output format</p></li><li><p>after it&#8217;s done, extract the answer with the synthesizer</p></li></ol><p>The agent needs freedom in how it gets there&#8212;multiple queries, different SQL shapes, different intermediate steps.</p><p>The synthesizer simply normalizes the output so you can evaluate the result, not the path.</p><h1>JSON trace</h1><p>Another strength of nao&#8217;s testing framework is that it collects all the run metadata in one central place.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V10t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V10t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png 424w, https://substackcdn.com/image/fetch/$s_!V10t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png 848w, https://substackcdn.com/image/fetch/$s_!V10t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!V10t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V10t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png" width="544" height="363.16483516483515" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1456,&quot;resizeWidth&quot;:544,&quot;bytes&quot;:136857,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thenewaiorder.substack.com/i/190607745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!V10t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png 424w, https://substackcdn.com/image/fetch/$s_!V10t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png 848w, https://substackcdn.com/image/fetch/$s_!V10t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!V10t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d13b538-df8d-4b0e-8f17-2b6b073dec5f_1858x1240.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>Why does this matter?</p><p>Because it gives you freedom in how you debug and iterate.</p><p>You can:</p><ul><li><p>inspect runs in nao&#8217;s UI (nao test serve)</p></li><li><p>ask another agent to analyze failures</p></li><li><p>build your own workflow on top of the raw logs, or export everything to your analytics stack.</p></li></ul><p>No lock-in.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Spvp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Spvp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Spvp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png" width="700" height="393.75" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:700,&quot;bytes&quot;:79805,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189053785?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Spvp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">nao&#8217;s UI for test results analysis</figcaption></figure></div><p>Furthermore, the log file and especially the tool calls, lets you reconstruct exactly what the agent did, step by step:</p><ul><li><p>Which files did it read?</p></li><li><p>Did it query the right tables?</p></li><li><p>Did it try several SQL queries unsuccessfully before getting stuck?</p></li></ul><p>All of that is traceable.</p><h1>What&#8217;s Covered (and What Isn&#8217;t)</h1><p>Let&#8217;s be explicit about scope.</p><p>There are three steps in an analytics agent&#8217;s response:</p><ol><li><p>Map the question to an intent</p></li><li><p>Retrieve the right data</p></li><li><p>Present the result</p></li></ol><p>nao&#8217;s testing framework mainly targets (1) + (2)&#8212;especially retrieval.</p><p>The hypothesis is simple: if the agent reliably retrieves the correct information, you&#8217;ve solved the hardest part of chat-BI.</p><h3>Limitation of output-only checks</h3><p>nao validates the final output, not the path.</p><p>That means you can get false positives in some tricky cases.</p><p>Example:</p><ul><li><p>Question: &#8220;What is the conversion rate of product X?&#8221;</p></li><li><p>Golden SQL returns: 0.45</p></li><li><p>The agent takes a wrong path (wrong table, wrong join)&#8230; but <em>by chance</em> still ends up with 0.45</p></li><li><p>The test passes, even though the reasoning was wrong</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_bXb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_bXb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png 424w, https://substackcdn.com/image/fetch/$s_!_bXb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png 848w, https://substackcdn.com/image/fetch/$s_!_bXb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png 1272w, https://substackcdn.com/image/fetch/$s_!_bXb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_bXb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png" width="249" height="201.76795580110496" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1086,&quot;resizeWidth&quot;:249,&quot;bytes&quot;:65223,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thenewaiorder.substack.com/i/190607745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_bXb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png 424w, https://substackcdn.com/image/fetch/$s_!_bXb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png 848w, https://substackcdn.com/image/fetch/$s_!_bXb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png 1272w, https://substackcdn.com/image/fetch/$s_!_bXb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004052aa-6a50-4ffd-a4ea-e4d498c1fcae_1086x880.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This points to an obvious evolution for the framework: the ability to add path constraints (quality gates), for example:</p><ul><li><p>&#8220;This table must be used&#8221;</p></li><li><p>&#8220;This join relation must be used&#8221;</p></li><li><p>&#8220;This context file must be read&#8221;</p></li><li><p>&#8220;This metric must be called&#8221;</p></li></ul><p>That likely means introducing a small DSL so you can express these constraints cleanly in test definitions.</p><h2>Context debugging tool</h2><p>nao provides a good foundation to push context building further.</p><p>Once you have tool-call logs, you can go beyond pass/fail and start debugging the context itself.</p><p>A few ideas that would be extremely valuable:</p><p><strong>Context heatmap</strong></p><p>Which context files are actually used? If you have 50 files and only 10 are ever accessed, that&#8217;s a signal: the rest may be noise&#8212;or simply not discoverable.</p><p>You could even go beyond the file level and measure usage at the section level using tool logs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dL1k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dL1k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png 424w, https://substackcdn.com/image/fetch/$s_!dL1k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png 848w, https://substackcdn.com/image/fetch/$s_!dL1k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png 1272w, https://substackcdn.com/image/fetch/$s_!dL1k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dL1k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png" width="387" height="298.1803278688525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1034,&quot;width&quot;:1342,&quot;resizeWidth&quot;:387,&quot;bytes&quot;:67754,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thenewaiorder.substack.com/i/190607745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!dL1k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png 424w, https://substackcdn.com/image/fetch/$s_!dL1k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png 848w, https://substackcdn.com/image/fetch/$s_!dL1k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.png 1272w, https://substackcdn.com/image/fetch/$s_!dL1k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd905bb-530c-4ca8-a5eb-5b9636e8e9a2_1342x1034.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><strong>Context holes</strong></p><p>Does the agent repeatedly search for information that doesn&#8217;t exist? If it reads 20 files before answering a simple question, something is off.</p><p><strong>Context contradictions</strong></p><p>Across runs, does the agent pull definitions from different files&#8212;and does that change the output? That&#8217;s a great way to detect conflicting rules or duplicated definitions.</p><h1>Conclusion</h1><p>The hard part isn&#8217;t writing test cases.</p><p>The hard part is defining what &#8220;correct&#8221; means for an agent with freedom.</p><p>nao&#8217;s answer:</p><ul><li><p>Let the agent behave like an agent</p></li><li><p>Compute the expected result independently</p></li><li><p>Use a second model to normalize the answer</p></li><li><p>Compare the data, not the path</p></li></ul><p>This is a solid foundation. But there&#8217;s clear room to evolve:</p><ul><li><p>Path validation to catch false positives</p></li><li><p>Context observability to turn test logs into insights</p></li></ul><p>The next frontier isn&#8217;t just &#8220;did it work?&#8221;</p><p>It&#8217;s &#8220;how did it work, and what does that tell us about our context?&#8221;</p><div><hr></div><p><em>I hope this post helped you understand how modern Chat-BI systems are built.</em></p><p><em>This is the 4th episode of a mini-series we&#8217;re working on with the nao team.</em></p><p><em>In the coming weeks, we&#8217;ll publish deeper dives on:</em></p><ul><li><p><em>BI-Agents and memory</em></p></li><li><p><em>The impact of Chat-BI on data roles</em></p></li></ul><p><em>Stay tuned.</em></p><div><hr></div><p>We have released a new episod of our podcast with <a href="https://open.substack.com/users/29055154-blef?utm_source=mentions">blef</a> (in english :)). Check it out here:</p><div id="youtube2-4pW64acuSP8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;4pW64acuSP8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/4pW64acuSP8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Thanks for reading,</p><p>Ju</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Semantic Layer = Map for Chat-BI Agents]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 98]]></description><link>https://juhache.substack.com/p/semantic-layer-map-for-chat-bi-agents</link><guid isPermaLink="false">https://juhache.substack.com/p/semantic-layer-map-for-chat-bi-agents</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Tue, 10 Mar 2026 11:45:56 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/064a3a57-54b0-49fc-a4bb-6ee1676668a1_960x966.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I&#8217;m Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p></blockquote><p>This is the third episode of my chat-BI series with <a href="https://github.com/getnao/nao">nao</a>.</p><p>A quick recap:</p><ul><li><p><strong>Post 1:</strong> I explored a modern approach to chat-BI, using the filesystem to store and serve context to the model.</p></li></ul><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;98f60fab-d8ba-442c-9cd8-1d6c8a6512e8&quot;,&quot;caption&quot;:&quot;Bonjour!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;ChatBI 101: From Wild Horses to Workhorse LLMs&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-18T14:30:06.521Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4fa06529-97f6-4811-8ffd-87f04448423a_710x469.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/chatbi-101-from-wild-horses-to-workhorse&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:187515215,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:14,&quot;comment_count&quot;:5,&quot;publication_id&quot;:1211981,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Ev6t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><ul><li><p><strong>Post 2:</strong> I stress-tested that setup on real benchmarks.</p></li></ul><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;6f45be04-1b26-4b74-a946-013698194438&quot;,&quot;caption&quot;:&quot;Bonjour!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;SQL Is Solved. Here's Where Chat-BI Still Breaks.&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-03-02T09:00:55.646Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50d292fb-1a81-4b0a-a15a-55b66bc84d86_1092x1262.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/sql-is-solved-heres-where-chat-bi&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:189053785,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:9,&quot;comment_count&quot;:2,&quot;publication_id&quot;:1211981,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Ev6t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>We ran 25 questions across BIRD + DABStep.</p><p>Out of all the errors, none were SQL errors.</p><p>The failures happened <em>before</em> SQL:</p><ul><li><p>Interpretation: the model misreads metric definitions</p></li><li><p>Framing: it answers questions that have no answer in the data</p></li><li><p>Common sense: it misses basic conventions</p></li></ul><p>So where does that leave us?</p><p>If context isn&#8217;t enough&#8212;and RULES.md doesn&#8217;t scale&#8212;how do we get reliability?</p><p>My take: stop asking the model to navigate from scratch. Give it a map.</p><p>That&#8217;s what a semantic layer is: predefined routes and hard definitions for your metrics.</p><p>In this post, we&#8217;ll rerun the same benchmarks from Post 2 with a semantic layer in the loop and see which failure nodes disappear&#8212;and which ones remain.</p><p>Let&#8217;s go.</p><h1>What is a semantic layer ?</h1><p>Think of a semantic layer as a set of predefined itineraries your agents can pick to navigate your schema.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ytDm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ytDm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png 424w, https://substackcdn.com/image/fetch/$s_!ytDm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png 848w, https://substackcdn.com/image/fetch/$s_!ytDm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png 1272w, https://substackcdn.com/image/fetch/$s_!ytDm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ytDm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png" width="1456" height="515" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:515,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:155805,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ytDm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png 424w, https://substackcdn.com/image/fetch/$s_!ytDm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png 848w, https://substackcdn.com/image/fetch/$s_!ytDm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.png 1272w, https://substackcdn.com/image/fetch/$s_!ytDm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6114367f-ef99-4be9-8821-0934de0935d6_2076x734.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>It defines metrics so they can be reused immediately&#8212;without having to think about joins, table relationships, or column definitions.</p><p>Metrics usually come from combining two things:</p><p>Measures are the calculations:</p><ul><li><p>revenue = SUM(amount) WHERE status = &#8216;completed&#8217;</p></li><li><p>fraud_rate = SUM(CASE WHEN is_fraud THEN eur_amount ELSE 0 END) / SUM(eur_amount)</p></li></ul><p>Dimensions are how you slice those measures: by country, by month, by product category&#8230; Same measure, different angles.</p><p>Users combine measures &#215; dimensions, and the semantic layer&#8217;s job is to generate the corresponding SQL against the underlying database.</p><h1>BSL? </h1><p>If you&#8217;ve been following my newsletter, you&#8217;ve seen BSL before.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NQE0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NQE0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png 424w, https://substackcdn.com/image/fetch/$s_!NQE0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png 848w, https://substackcdn.com/image/fetch/$s_!NQE0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png 1272w, https://substackcdn.com/image/fetch/$s_!NQE0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NQE0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png" width="506" height="266.55357142857144" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:767,&quot;width&quot;:1456,&quot;resizeWidth&quot;:506,&quot;bytes&quot;:312296,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!NQE0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png 424w, https://substackcdn.com/image/fetch/$s_!NQE0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png 848w, https://substackcdn.com/image/fetch/$s_!NQE0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png 1272w, https://substackcdn.com/image/fetch/$s_!NQE0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0caf85d9-88fd-452e-b822-37ea6a6c832b_1628x858.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If not: <a href="https://github.com/boringdata/boring-semantic-layer">Boring Semantic Layer</a> is a lightweight semantic layer built on top of Ibis, that we developed together with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Hussain Sultan&quot;,&quot;id&quot;:14512158,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71f75d39-4a06-4f43-a10d-19761f414f76_906x904.png&quot;,&quot;uuid&quot;:&quot;e8ac5784-e4c7-4a44-bfa7-e8df70387664&quot;}" data-component-name="MentionToDOM"></span>.</p><p>Install is literally:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;758b8853-8204-4933-91af-2a62b8ccbc74&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">pip install boring-semantic-layer</code></pre></div><p>How does it work, concretely?</p><p>You define measures and dimensions in YAML, and commit them next to your code:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;2c2327bc-e259-4ff9-87b2-a9a76d355a70&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">payments:
  table: transactions
  dimensions:
    merchant:
      expr: _.merchant
      description: "Merchant identifier / name"

  measures:
    total_volume:
      expr: _.eur_amount.sum()
      description: "Total monetary volume in EUR"</code></pre></div><p>This YAML can be used directly by an LLM to query data.</p><p>Give it the BSL Python library, and it can execute queries like:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;befc95d4-ad72-4417-b9c9-5a77983089e8&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">bsl.model("payments")
    .group_by("ip_country")
    .aggregate("fraud_rate", "total_volume")
    .execute()</code></pre></div><p>When we designed BSL, composability was a core goal. You can enhance any semantic model in three ways:</p><ul><li><p>One-off post-aggregation transforms (ad hoc calculations)</p></li></ul><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;3a15da43-1ba8-47ba-a0b7-7cf90d6dde5c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">flights_st
    .group_by("carrier")
    .aggregate("flight_count")
    .mutate(market_share=_.flight_count / _.flight_count.sum().over(w) * 100)</code></pre></div><ul><li><p>Add new measures and dimensions (promote ad hoc logic into reusable metrics)</p></li></ul><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;b979aee7-e9b1-42fc-a62f-309e7e1adc72&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">flights_st = flights_st.with_measures(
    market_share=lambda t: t.flight_count / t.all(t.flight_count) * 100,
)</code></pre></div><ul><li><p>Join models together (compose richer semantic models)</p></li></ul><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;0b2dd1ef-4469-4ff2-ba33-3518369aceb9&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">flights_with_carriers = flights_st.join_many(
    carriers_st,
    lambda f, c: f.carrier_code == c.code,
)</code></pre></div><p>And the cherry on the cake: there&#8217;s no lock-in.</p><p>Your LLM can always ask BSL for the raw SQL it generates, then tweak it if needed:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;07dded37-7ea1-4d1e-8c1d-7dbd0df4f081&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">q = payments.group_by("ip_country").aggregate("fraud_rate", "total_volume")
q.sql()</code></pre></div><h1>BSL + nao</h1><p>If you&#8217;ve followed the previous episodes, you&#8217;ve seen how an LLM can navigate a filesystem to gather context before querying the database.</p><p>That&#8217;s why a YAML-based semantic layer fits so well here: it&#8217;s just another set of files the model can read.</p><p>The semantic model stays in the background&#8212;an extra context source, not a central platform in your stack.</p><p>Your context becomes a clean, version-controlled bundle:</p><ul><li><p>Schema metadata (tables, columns, relationships)</p></li><li><p>Docs + rules (RULES.md + supporting .md files)</p></li><li><p>Metric definitions (measures + dimensions in YAML)</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_!a4cI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a4cI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png 424w, https://substackcdn.com/image/fetch/$s_!a4cI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png 848w, https://substackcdn.com/image/fetch/$s_!a4cI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png 1272w, https://substackcdn.com/image/fetch/$s_!a4cI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a4cI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png" width="527" height="492.50278551532034" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1342,&quot;width&quot;:1436,&quot;resizeWidth&quot;:527,&quot;bytes&quot;:130623,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!a4cI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png 424w, https://substackcdn.com/image/fetch/$s_!a4cI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png 848w, https://substackcdn.com/image/fetch/$s_!a4cI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.png 1272w, https://substackcdn.com/image/fetch/$s_!a4cI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782f29e2-6a5e-45d0-a25d-a259762a42dd_1436x1342.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>That way, the LLM can navigate different layers of context depending on what the question requires:</p><p>RULES.md &#8594; metrics (YAML) &#8594; schema</p><p>Start with high-level guardrails, fall back to metric definitions for business logic, and only drop down to the raw schema when it needs table/column details.</p><h1>Demo</h1><p>I took the same nao setup as in the previous episode and added BSL into the mix.</p><p>Concretely, I only added two files:</p><ul><li><p><strong>profiles.yaml</strong> &#8212; DB connection</p></li></ul><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;5f558e09-7075-4af4-b314-85ceffd82430&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">dabstep_db:
  type: duckdb
  database: "./dabstep.duckdb"
  read_only: true</code></pre></div><ul><li><p><strong>semantic_model.yaml </strong>&#8212; dimensions + measures</p></li></ul><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;624964f5-6c27-4156-a348-7957b7e6c843&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">payments:
  table: payments
  description: "Payment transactions processed by the payment processor. Each row is one transaction with amount, fraud status, and card/country metadata."
  dimensions:
    merchant:
      expr: _.merchant
      description: "Merchant name"
    card_scheme:
      expr: _.card_scheme
      description: "Card scheme: MasterCard, Visa, Amex, Other"
...
  measures:
    transaction_count:
      expr: _.count()
      description: "Total number of transactions"
...</code></pre></div><p>After that, my project looked like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;40c85a65-bf73-4ab0-a1da-8e97a4222a9b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">dabstep_bsl/
  &#9500;&#9472;&#9472; nao_config.yaml            &#8592; project config (DB + LLM)
  &#9500;&#9472;&#9472; RULES.md                   &#8592; agent instructions
  &#9500;&#9472;&#9472; semantic_model.yml         &#8592; BSL metric definitions
  &#9500;&#9472;&#9472; profiles.yml               &#8592; DuckDB connection config
  &#9474;
  &#9500;&#9472;&#9472; docs/
  &#9474;   &#9492;&#9472;&#9472; manual.md              &#8592; business rules &amp; definitions
  &#9474;
  &#9500;&#9472;&#9472; databases/                 &#8592; schema metadata (nao context)
  &#9474;   &#9492;&#9472;&#9472; type=duckdb/database=dabstep/schema=main/
  &#9474;       &#9500;&#9472;&#9472; table=payments/
  &#9474;       &#9500;&#9472;&#9472; table=fees/
  &#9474;       &#9500;&#9472;&#9472; table=merchants/
  &#9474;       &#9492;&#9472;&#9472; ...</code></pre></div><p>I finished by adding a small note in RULES.md:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;0a148b68-cc4b-4a5e-9fad-76c7355c97e5&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">... 
## Semantic Model
We use `boring-semantic-layer` for canonical metric definitions (`semantic_model.yml` + `profiles.yml`).

Use sandboxed execution to run BSL queries like:

```python
from boring_semantic_layer import from_yaml

models = from_yaml("semantic_model.yml", profile="dabstep_db", profile_path="profiles.yml")
payments = models["payments"]

df = (
    payments
    .filter(lambda _: _.is_credit == True)
    .group_by("card_scheme")
    .aggregate("transaction_volume")
    .execute()
)
df
...</code></pre></div><p>And enabling two things in nao:</p><ul><li><p>Sandboxed Python execution </p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wv98!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wv98!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png 424w, https://substackcdn.com/image/fetch/$s_!wv98!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png 848w, https://substackcdn.com/image/fetch/$s_!wv98!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png 1272w, https://substackcdn.com/image/fetch/$s_!wv98!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wv98!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png" width="654" height="61.28257686676427" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:128,&quot;width&quot;:1366,&quot;resizeWidth&quot;:654,&quot;bytes&quot;:25960,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!wv98!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png 424w, https://substackcdn.com/image/fetch/$s_!wv98!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png 848w, https://substackcdn.com/image/fetch/$s_!wv98!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png 1272w, https://substackcdn.com/image/fetch/$s_!wv98!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82ea12a0-db1c-4722-8af8-0780c8fee435_1366x128.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>With nao&#8217;s sandboxes, the agent can safely run BSL queries in a safe runtime&#8212;no raw eval().</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZVG9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZVG9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png 424w, https://substackcdn.com/image/fetch/$s_!ZVG9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png 848w, https://substackcdn.com/image/fetch/$s_!ZVG9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png 1272w, https://substackcdn.com/image/fetch/$s_!ZVG9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZVG9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png" width="649" height="196.5721153846154" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:441,&quot;width&quot;:1456,&quot;resizeWidth&quot;:649,&quot;bytes&quot;:70878,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ZVG9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png 424w, https://substackcdn.com/image/fetch/$s_!ZVG9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png 848w, https://substackcdn.com/image/fetch/$s_!ZVG9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png 1272w, https://substackcdn.com/image/fetch/$s_!ZVG9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa875ffe7-ad18-4422-9bba-a57667a48533_1810x548.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p><strong>Web search</strong> (so it can look up BSL docs when needed)</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jvHB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jvHB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png 424w, https://substackcdn.com/image/fetch/$s_!jvHB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png 848w, https://substackcdn.com/image/fetch/$s_!jvHB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png 1272w, https://substackcdn.com/image/fetch/$s_!jvHB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jvHB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png" width="642" height="84.49785407725322" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45003483-5a48-4c95-9454-3891745cb615_1398x184.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:184,&quot;width&quot;:1398,&quot;resizeWidth&quot;:642,&quot;bytes&quot;:32736,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jvHB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png 424w, https://substackcdn.com/image/fetch/$s_!jvHB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png 848w, https://substackcdn.com/image/fetch/$s_!jvHB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png 1272w, https://substackcdn.com/image/fetch/$s_!jvHB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45003483-5a48-4c95-9454-3891745cb615_1398x184.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Then I ran a quick smoke test in nao chat: nao&#8217;s agent automatically understood it needed to install BSL inside its sandbox.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fpK1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fpK1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.png 424w, https://substackcdn.com/image/fetch/$s_!fpK1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.png 848w, https://substackcdn.com/image/fetch/$s_!fpK1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!fpK1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fpK1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.png" width="636" height="468.70054945054943" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df852e56-0170-4214-90da-99a8a0235da1_1476x1088.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1073,&quot;width&quot;:1456,&quot;resizeWidth&quot;:636,&quot;bytes&quot;:346559,&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://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.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_!fpK1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.png 424w, https://substackcdn.com/image/fetch/$s_!fpK1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.png 848w, https://substackcdn.com/image/fetch/$s_!fpK1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!fpK1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf852e56-0170-4214-90da-99a8a0235da1_1476x1088.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>Now let&#8217;s go back to the two questions that broke the system in Post 2 and see what happens this time.</p><h3><strong>Test 1: Interpretation failure</strong></h3><p>In Post 2, we asked:</p><blockquote><p><em>What is the top country (ip_country) for fraud?</em></p></blockquote><p>The agent used COUNT(*) instead of SUM(eur_amount).</p><p>I added there fore a metric in BSL:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;72f88200-efba-4b23-aacf-346f3b9ff366&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">fraud_rate:
    expr: (_.has_fraudulent_dispute.cast("int64") * _.eur_amount).sum() / _.eur_amount.sum()</code></pre></div><p>And the model picked it up directly:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-vAw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-vAw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png 424w, https://substackcdn.com/image/fetch/$s_!-vAw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png 848w, https://substackcdn.com/image/fetch/$s_!-vAw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!-vAw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-vAw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png" width="620" height="559.9587912087912" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1315,&quot;width&quot;:1456,&quot;resizeWidth&quot;:620,&quot;bytes&quot;:268219,&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://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.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_!-vAw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png 424w, https://substackcdn.com/image/fetch/$s_!-vAw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png 848w, https://substackcdn.com/image/fetch/$s_!-vAw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!-vAw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0627c7-1f6a-4cea-a064-8e41f7b91542_1546x1396.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>One metric call. No interpretation. Correct answer: BE.</p><p>And that&#8217;s the biggest advantage of a semantic layer for me: it reduces the number of failure nodes and makes chat-BI agents much more reliable.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4phI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4phI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png 424w, https://substackcdn.com/image/fetch/$s_!4phI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png 848w, https://substackcdn.com/image/fetch/$s_!4phI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png 1272w, https://substackcdn.com/image/fetch/$s_!4phI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4phI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png" width="603" height="492.2448979591837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1078,&quot;resizeWidth&quot;:603,&quot;bytes&quot;:95873,&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://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.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_!4phI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png 424w, https://substackcdn.com/image/fetch/$s_!4phI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png 848w, https://substackcdn.com/image/fetch/$s_!4phI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.png 1272w, https://substackcdn.com/image/fetch/$s_!4phI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdafe907-2613-4fe5-a4d0-f251f9bdefe6_1078x880.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><h3><strong>Test 2: Framing failure</strong></h3><p>In Post 2, we asked:</p><blockquote><p><em>Is Martinis_Fine_Steakhouse in danger of getting a high-fraud rate fine?</em></p></blockquote><p>The expected answer was &#8220;Not Applicable&#8221;&#8212;no such concept exists in the data. </p><p>But the agent invented a definition and answered &#8220;Yes.&#8221;</p><p>With the semantic layer we had the same problem:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!irsX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!irsX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png 424w, https://substackcdn.com/image/fetch/$s_!irsX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png 848w, https://substackcdn.com/image/fetch/$s_!irsX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png 1272w, https://substackcdn.com/image/fetch/$s_!irsX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!irsX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png" width="586" height="557.8269230769231" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1386,&quot;width&quot;:1456,&quot;resizeWidth&quot;:586,&quot;bytes&quot;:243374,&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://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.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_!irsX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png 424w, https://substackcdn.com/image/fetch/$s_!irsX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png 848w, https://substackcdn.com/image/fetch/$s_!irsX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.png 1272w, https://substackcdn.com/image/fetch/$s_!irsX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a817dc-64e6-4f40-92c2-70d24943fbb7_1536x1462.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 tried tightening RULES.md with a stricter decision policy:</p><ul><li><p>Prefer BSL: if the metric exists in semantic_model.yml, use it.</p></li><li><p>If it&#8217;s not in BSL: decide whether it&#8217;s in-scope but undefined (ask for confirmation) or out-of-scope (answer &#8220;Not Applicable&#8221;).</p></li></ul><p>But it still didn&#8217;t reliably work.</p><p>So framing errors remain an open problem for me. </p><p>The missing piece is a stronger grounding mechanism&#8212;something that forces the agent to prove a concept exists before answering.</p><h1>Rules.md vs Semantic Layer</h1><p>So when do you add a rule to RULES.md, and when do you define a metric in the semantic layer?</p><p>My rule of thumb:</p><ul><li><p>Use RULES.md for behavior: how the agent should think, what to read first, how to answer, what not to invent, how to handle ambiguity. Keep it short&#8212;guardrails, not business logic.</p></li><li><p>Use the semantic layer for definitions: anything that must be precise and reusable&#8212;metric formulas, filters, time windows, what &#8220;volume&#8221; means, what counts as fraud, etc.</p></li></ul><p>In practice:</p><ol><li><p>Start with basic context + a handful of core metrics.</p></li><li><p>Ship, log failures, and turn recurring errors into eval questions.</p></li><li><p>If an interpretation issue keeps repeating (&#8220;volume&#8221;, &#8220;active&#8221;, &#8220;churn&#8221;), promote it into the semantic layer.</p><ul><li><p>Guidance = RULES.md</p></li><li><p>Contract = semantic layer</p></li></ul></li><li><p>Rerun eval and refine metric names/descriptions until selection is stable.</p></li></ol><p>This loop&#8212;observe &#8594; eval &#8594; promote &#8594; validate&#8212;keeps RULES.md lean, grows the semantic layer with real usage, and prevents context drift.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SpZG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SpZG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png 424w, https://substackcdn.com/image/fetch/$s_!SpZG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png 848w, https://substackcdn.com/image/fetch/$s_!SpZG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png 1272w, https://substackcdn.com/image/fetch/$s_!SpZG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SpZG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png" width="626" height="417.0467032967033" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1456,&quot;resizeWidth&quot;:626,&quot;bytes&quot;:76655,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189801546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!SpZG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png 424w, https://substackcdn.com/image/fetch/$s_!SpZG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png 848w, https://substackcdn.com/image/fetch/$s_!SpZG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.png 1272w, https://substackcdn.com/image/fetch/$s_!SpZG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d441bf-8bbb-49df-92d8-16ae165995dd_1492x994.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><div><hr></div><p><em>This was episode 3 of a mini-series with the nao team on chat-BI architectures and design patterns.</em></p><p><em><strong>Next episode:</strong> what chat-BI changes for data roles (analytics, BI, analytics engineering, and data platform).</em></p><div><hr></div><p>We have released a new episode of our podcast with <a href="https://open.substack.com/users/29055154-blef?utm_source=mentions">blef</a> (in french). Check it out here:</p><div id="youtube2-35_qFKstMoc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;35_qFKstMoc&quot;,&quot;startTime&quot;:&quot;9s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/35_qFKstMoc?start=9s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Thanks for reading,</p><p>Ju</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[SQL Is Solved. Here's Where Chat-BI Still Breaks.]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 97]]></description><link>https://juhache.substack.com/p/sql-is-solved-heres-where-chat-bi</link><guid isPermaLink="false">https://juhache.substack.com/p/sql-is-solved-heres-where-chat-bi</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Mon, 02 Mar 2026 09:00:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/50d292fb-1a81-4b0a-a15a-55b66bc84d86_1092x1262.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I&#8217;m Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p>This is the second episode of my chat-BI series in collaboration with <a href="https://github.com/getnao/nao">nao</a>.</p><p>In the last post, I explored a modern approach to chat-BI: using the filesystem to store and serve context to the model.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;101c4012-defe-46cf-ae8b-8384d5b0b860&quot;,&quot;caption&quot;:&quot;Bonjour!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;ChatBI 101: From Wild Horses to Workhorse LLMs&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-18T14:30:06.521Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4fa06529-97f6-4811-8ffd-87f04448423a_710x469.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/chatbi-101-from-wild-horses-to-workhorse&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:187515215,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:13,&quot;comment_count&quot;:5,&quot;publication_id&quot;:1211981,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Ev6t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Here, the LLM reads the codebase to reconstruct the data model, then runs iterative queries&#8212;refining its hypothesis each step&#8212;until it converges on an answer.</p><p>In this post, I continue the exploration and try to find the limits of this setup. I want to understand <em>when</em> it fails and <em>what kinds of errors</em> it produces.</p><p>The goal is to build intuition for where agentic chat-BI breaks down&#8212;and why. </p><p>I think this can help data teams a lot: not just to benchmark models, but to understand the practical limits of these systems and how to improve them.</p><p>This will be quite empirical, but I think it&#8217;s a necessary step to build that intuition.</p><p>Let&#8217;s go.</p><h1>The Setup</h1><p>Inspired by Jacob Maston <a href="https://motherduck.com/blog/bird-bench-and-data-models/">blog post</a>, where he tested BIRD-Bench with schema-only context,  I used the following two benchmarks:</p><ul><li><p><a href="https://bird-bench.github.io/">BIRD</a>: the most widely used text-to-SQL benchmark. It has 500 question&#8211;SQL pairs across 11 databases.</p><p><strong>Context provided:</strong> column descriptions only.</p><p></p></li><li><p><a href="https://huggingface.co/blog/dabstep">DABStep</a>: a newer benchmark from Adyen and Hugging Face. It includes 450+ tasks derived from real financial analytics workflows&#8212;not synthetic questions, but actual problems data analysts face at a payments company.</p><p><strong>Context provided:</strong> one large manual.md file + some column descriptions.</p></li></ul><p>BIRD is large, but label quality can be uneven. I isolated a subset of BIRD (the financial dataset) and ran an initial LLM pass to validate the labels. Only 15 questions remained.</p><p>DABStep, on the other hand, has only 10 labeled questions in its dev set.</p><p>So I merged the two sets. I now have 25 questions that should, in theory, be close to the edge of the kinds of &#8220;real&#8221; questions someone might ask a system like this.</p><p>Yes, this is too small to produce a reliable performance metric. But it should be enough to surface failure modes and collect a set of wrong answers.</p><h1>Eval Framework</h1><p>I used <a href="https://github.com/getnao/nao">Nao</a> as the evaluation framework&#8212;they provide a few utilities that make the process pretty smooth.</p><p>You simply define question/answer pairs in separate YAML files:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;187c1f72-e7b0-4c4e-8ff6-d22d2b6e9b73&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">name: dabstep_1681
prompt: &#8216;For the 10th of the year 2023, what are the Fee IDs applicable to Belles_cookbook_store?


  Guidelines: Answer must be a list of values in comma separated list, eg: A, B, C. If the answer is an empty list, reply with an empty string. If a question does not have a relevant or applicable answer
  for the task, please respond with &#8216;&#8217;Not Applicable&#8217;&#8216;&#8217;
sql: SELECT &#8216;741, 709, 454, 813, 381, 536, 473, 572, 477, 286&#8217; AS expected_answer
</code></pre></div><p>And then nao test cmd processes them one by one:</p><ul><li><p>Run chat agent on each question</p></li><li><p>Compare the result with the golden answer</p></li><li><p>Collect token usage + tool-call metrics along the way</p></li><li><p>Serve a UI to explore the result</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pgBG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pgBG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png 424w, https://substackcdn.com/image/fetch/$s_!pgBG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png 848w, https://substackcdn.com/image/fetch/$s_!pgBG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png 1272w, https://substackcdn.com/image/fetch/$s_!pgBG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pgBG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png" width="509" height="681.1495934959349" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1646,&quot;width&quot;:1230,&quot;resizeWidth&quot;:509,&quot;bytes&quot;:237163,&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://juhache.substack.com/i/189053785?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.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_!pgBG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png 424w, https://substackcdn.com/image/fetch/$s_!pgBG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png 848w, https://substackcdn.com/image/fetch/$s_!pgBG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.png 1272w, https://substackcdn.com/image/fetch/$s_!pgBG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb07e74d4-edeb-48b2-9be4-cf34a86250aa_1230x1646.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>For both benchmarks, I followed the same procedure:</p><ul><li><p>Create a DuckDB instance with the benchmark data</p></li><li><p>Run nao sync to dump schema metadata into context files</p></li></ul><p>I also cleaned up the context provided by the benchmarks and moved the column descriptions into Nao&#8217;s native format for both datasets.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;746e1f95-a5fa-4b3c-ad84-46d326f27dc0&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">  &#9492;&#9472;&#9472; databases/
      &#9492;&#9472;&#9472; type=duckdb/
          &#9492;&#9472;&#9472; database=dabstep/
              &#9492;&#9472;&#9472; schema=main/
                  &#9492;&#9472;&#9472; table=*/
                      &#9500;&#9472;&#9472; columns.md
                      &#9500;&#9472;&#9472; description.md
                      &#9492;&#9472;&#9472; preview.md</code></pre></div><p>For DABStep, I simply copied the large manual.md file into the docs/ folder and referenced it in RULES.md.</p><p>I first ran a few smoke tests to get a feel for the models: I had to tweak the RULES.md file for DABStep. The agent was skipping the context files I&#8217;d placed in the docs/ folder. So I added a classic rule in RULES.md:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;f6b7e22f-54ac-4d29-a012-4ab1ef11e316&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">IMPORTANT: Before writing any SQL query, you MUST read `docs/manual.md` first. 
It contains critical business definitions that you cannot guess from the data alone. 
Then read `docs/payments-readme.md` for column descriptions.
</code></pre></div><h1>SQL is solved</h1><p>Now that everything was ready, I ran the benchmark on the two datasets with Opus 4.5.</p><p>Here are the first-pass results:</p><ul><li><p><strong>BIRD:</strong> 11/15 correct answers</p></li><li><p><strong>DABStep:</strong> 3/10 correct answers</p></li></ul><p>When I first looked at the results, my takeaway was: LLMs have gotten really good at writing SQL. I didn&#8217;t see any SQL syntax errors.</p><p>So this confirms the intuition that SQL is no longer the bottleneck.</p><p>Next, I dug into the failures. </p><p>To do that, I used Nao&#8217;s UI, which makes it easy to inspect the agent&#8217;s tool calls and reasoning step by step.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Spvp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Spvp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Spvp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png" width="700" height="393.75" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:700,&quot;bytes&quot;:79805,&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://juhache.substack.com/i/189053785?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.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_!Spvp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!Spvp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4678cf2b-298d-4fa2-b4df-520ef59375f0_1280x720.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 next sections might be a bit tedious to read, but I think they&#8217;re worth it to understand where LLMs still struggle today.</em></p><h2>Error: Context Ambuigity</h2><ul><li><p>Question</p></li></ul><p>What is the top country (ip_country) for fraud? A. NL, B. BE, C. ES, D. FR </p><ul><li><p>Context</p></li></ul><p>Fraud is defined in the context file as: fraudulent volume / total volume</p><ul><li><p>What went wrong</p></li></ul><p>The agent interpreted volume as number of transactions, so it used COUNT(*).</p><p>But the golden answer assumes volume means monetary volume, so it should use SUM(amount).</p><p>This isn&#8217;t a SQL problem&#8212;it&#8217;s a definition problem. If the context doesn&#8217;t specify what &#8220;volume&#8221; means, the agent can&#8217;t reliably choose the intended metric.</p><p>So I added a new rule un RULES.md:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;6c326e4a-f085-41b3-aed6-077c07566326&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">In the payments domain, "volume" always refers to monetary amount (sum of eur_a +mount), not transaction count.
</code></pre></div><p>And rerun the eval.</p><p>The agent picked the right interpretation of &#8220;volume,&#8221; but failed at the next failure node: it computed total fraudulent volume (an absolute value) instead of the fraud rate (a ratio).</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SIbq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SIbq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SIbq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SIbq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SIbq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SIbq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg" width="185" height="174" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:174,&quot;width&quot;:185,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Banging Head Desk Meme Stock Illustrations &#8211; 3 Banging Head ...&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Banging Head Desk Meme Stock Illustrations &#8211; 3 Banging Head ..." title="Banging Head Desk Meme Stock Illustrations &#8211; 3 Banging Head ..." srcset="https://substackcdn.com/image/fetch/$s_!SIbq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SIbq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SIbq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SIbq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d7e096-cfb9-41c2-b521-77ac3f21bf3c_185x174.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>In other words, even after clearing the first interpretation step it tripped this time on the next one (&#8220;is the metric a <em>ratio</em> or an <em>absolute</em>?&#8221;).</p><p>So my takeaway is: </p><p>Every small ambiguity introduces a new interpretation node&#8212;and each node is a chance to fail. </p><p>As analyses get more complex, the number of nodes increases, and the probability of an error compounds quickly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZVTA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZVTA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png 424w, https://substackcdn.com/image/fetch/$s_!ZVTA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png 848w, https://substackcdn.com/image/fetch/$s_!ZVTA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png 1272w, https://substackcdn.com/image/fetch/$s_!ZVTA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZVTA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png" width="623" height="471.9567307692308" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1103,&quot;width&quot;:1456,&quot;resizeWidth&quot;:623,&quot;bytes&quot;:140673,&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://juhache.substack.com/i/189053785?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.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_!ZVTA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png 424w, https://substackcdn.com/image/fetch/$s_!ZVTA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png 848w, https://substackcdn.com/image/fetch/$s_!ZVTA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png 1272w, https://substackcdn.com/image/fetch/$s_!ZVTA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6e0d69-f361-4a72-85c8-b642c0c9a1a8_1558x1180.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Error: Knowing when you don&#8217;t know :)</h2><ul><li><p><strong>Question</strong></p></li></ul><p>Is Martinis_Fine_Steakhouse in danger of getting a high-fraud rate fine?</p><ul><li><p><strong>Expected</strong></p></li></ul><p>Not applicable</p><ul><li><p><strong>Agent answer</strong></p></li></ul><p>Yes</p><ul><li><p>What went wrong</p></li></ul><p>The concept of a &#8220;high-fraud rate fine&#8221; isn&#8217;t defined anywhere in the data or documentation. </p><p>The manual discusses fraud levels and how they impact processing fees, but there&#8217;s no explicit <em>fine</em> mechanism.</p><p>The agent inferred that such a fine exists and answered &#8220;yes,&#8221; instead of recognizing that the question refers to something outside the available context.</p><p>I tried adding this to RULES.md:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;f0642030-073c-4a13-9689-e5fd00e27bc1&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">If a concept or metric is not defined in the documentation or data, 
do not invent a definition. Answer "Not Applicable" instead.</code></pre></div><p>But the agent kept returning the same wrong answer. It finds enough <em>related</em> data to construct something plausible.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xJbK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xJbK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png 424w, https://substackcdn.com/image/fetch/$s_!xJbK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png 848w, https://substackcdn.com/image/fetch/$s_!xJbK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png 1272w, https://substackcdn.com/image/fetch/$s_!xJbK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xJbK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png" width="387" height="375.3433734939759" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:996,&quot;resizeWidth&quot;:387,&quot;bytes&quot;:986883,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189053785?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!xJbK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png 424w, https://substackcdn.com/image/fetch/$s_!xJbK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png 848w, https://substackcdn.com/image/fetch/$s_!xJbK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.png 1272w, https://substackcdn.com/image/fetch/$s_!xJbK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ec6a456-19ac-48ec-8a67-1490de8f6050_996x966.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>My takeaway: </p><p>In line with the last section, we don&#8217;t only have interpretation failure nodes (ambiguous metrics, vague definitions, etc.). </p><p>We also have framing failure nodes.</p><p>Those framing decisions add another layer of compounding error:</p><ul><li><p>Interpretation failure nodes = choosing meaning </p></li><li><p>Framing failure nodes = choosing scope (is this answerable from the available schema/docs, or is it out of scope?)</p></li></ul><p>As we&#8217;ve seen, this is hard to fix with prompting alone. One possible approach would be to add a grounding mechanism, where the agent has to cite and justify its answer using specific sources from the available context and data.</p><h2>Error: Lack of Common Sense</h2><p><strong>Question:</strong> For the 10th of the year 2023, what are the Fee IDs applicable to Belles_cookbook_store?</p><p>The agent debated whether &#8220;10th of the year&#8221; meant January 10 or October, and eventually settled on October.</p><p>LLMs still miss basic conventions and &#8220;common sense&#8221; assumptions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Woo8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Woo8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png 424w, https://substackcdn.com/image/fetch/$s_!Woo8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png 848w, https://substackcdn.com/image/fetch/$s_!Woo8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png 1272w, https://substackcdn.com/image/fetch/$s_!Woo8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Woo8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png" width="336" height="313.66204986149586" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:674,&quot;width&quot;:722,&quot;resizeWidth&quot;:336,&quot;bytes&quot;:536141,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/189053785?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Woo8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png 424w, https://substackcdn.com/image/fetch/$s_!Woo8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png 848w, https://substackcdn.com/image/fetch/$s_!Woo8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png 1272w, https://substackcdn.com/image/fetch/$s_!Woo8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fce4df3-49d0-4a7e-b9bf-95cb868ccf12_722x674.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This adds a third failure node:</p><ul><li><p>Interpretation failure nodes</p></li><li><p>Framing failure nodes</p></li><li><p>Common-sense failure nodes = applying basic conventions and implicit assumptions</p></li></ul><p>The problem with these common-sense failures is that they&#8217;re hard to fix with context. You can&#8217;t keep adding endless rules to RULES.md for things that should be basic intuition.</p><p>These issues ultimately need to be solved by the underlying model.</p><h1>Iterative Context Building </h1><p>As you can see, building an evaluation loop&#8212;where you confront your LLM with canonical (gold) answers&#8212;is essential.</p><p>It&#8217;s the only practical way to surface failure nodes, understand what kind they are, and then decide what to do next.</p><p>A key trap is to use an LLM to generate the evaluation set. </p><p>That&#8217;s usually the wrong approach: the model will generate the most likely questions given your context, which means you&#8217;ll mostly test &#8220;happy paths.&#8221; Your agent will look artificially good&#8212;and you&#8217;ll miss the real failure nodes.</p><p>The better approach is to observe the system in production:</p><ul><li><p>Log failures and wrong answers</p></li><li><p>Classify them by failure node type (interpretation, framing, common sense, etc.)</p></li><li><p>Look for recurring patterns</p></li></ul><p>Once a pattern emerges, add it to your evaluation set. Then iterate on your context and prompts until the results stabilize.</p><p>The advantage of tools like Nao is that this process becomes reproducible and easy to plug into CI. You can run the test suite on every context change&#8212;every RULES.md update, every new column description, every doc tweak&#8212;and catch context drift the same way you prevent code regressions.</p><h1>Rules.md <strong>Spaghetti Prompt</strong></h1><p>RULES.md can quickly turn into a dumping ground of &#8220;Important:&#8221; instructions.</p><p>And at some point, the model stops treating it like guidance and starts treating it like noise.</p><p>There&#8217;s also a second trap: overfitting. </p><p>When you debug by patching each new failure with a very specific rule&#8212;something like:</p><blockquote><p>&#8220;If you get asked about X, then do Y.&#8221;</p></blockquote><p>&#8230;it might fix <em>that</em> case, but it doesn&#8217;t generalize. It doesn&#8217;t scale. And it gradually makes your context longer, more brittle, and harder for the model to follow.</p><p>So where does that leave us?</p><p>If context isn&#8217;t enough&#8212;and rules don&#8217;t scale&#8212;how do we get reliability?</p><p>Probably by combining probabilistic LLM behavior with deterministic metric definitions.</p><p>That&#8217;s what we&#8217;ll dig into in the next post.</p><div><hr></div><p><em>I hope this post helped you understand how modern Chat-BI systems are built.</em></p><p><em>This is the first episode of a mini-series we&#8217;re working on with the Nao team, exploring Chat-BI architectures and design patterns.</em></p><p><em>In the coming weeks, we&#8217;ll publish deeper dives on:</em></p><ul><li><p><em>Semantic models and Chat-BI</em></p></li><li><p><em>The impact of Chat-BI on data roles</em></p></li></ul><p><em>Stay tuned.</em></p><div><hr></div><p>We have released a new episod of our podcast with <a href="https://open.substack.com/users/29055154-blef?utm_source=mentions">blef</a> (in french). Check it out here:</p><div id="youtube2-NeS8m47u5po" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;NeS8m47u5po&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/NeS8m47u5po?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Thanks for reading,</p><p>Ju</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[ChatBI 101: From Wild Horses to Workhorse LLMs]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 96]]></description><link>https://juhache.substack.com/p/chatbi-101-from-wild-horses-to-workhorse</link><guid isPermaLink="false">https://juhache.substack.com/p/chatbi-101-from-wild-horses-to-workhorse</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Wed, 18 Feb 2026 14:30:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4fa06529-97f6-4811-8ffd-87f04448423a_710x469.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I&#8217;m Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p></p><p>It usually starts the same way.</p><p>Someone on the team says:</p><blockquote><p>&#8220;How hard can it be? </p><p>We already have the data. </p><p>LLMs are now super clever. </p><p>Let&#8217;s just plug them together.&#8221;</p></blockquote><p>So they do.</p><p>They give the model:</p><ul><li><p>access to the warehouse</p></li><li><p>the schema</p></li><li><p>a system prompt that says:</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_!wSin!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wSin!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png 424w, https://substackcdn.com/image/fetch/$s_!wSin!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png 848w, https://substackcdn.com/image/fetch/$s_!wSin!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png 1272w, https://substackcdn.com/image/fetch/$s_!wSin!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wSin!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png" width="366" height="377.0574018126888" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/548464fe-64f9-4265-b2fe-75c96009e442_662x682.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:682,&quot;width&quot;:662,&quot;resizeWidth&quot;:366,&quot;bytes&quot;:678572,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!wSin!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png 424w, https://substackcdn.com/image/fetch/$s_!wSin!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png 848w, https://substackcdn.com/image/fetch/$s_!wSin!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.png 1272w, https://substackcdn.com/image/fetch/$s_!wSin!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548464fe-64f9-4265-b2fe-75c96009e442_662x682.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>The first demo works.</p><p>They type:</p><blockquote><p>&#8220;What were last month&#8217;s revenues?&#8221;</p></blockquote><p>The model writes SQL, the database returns numbers.</p><p>Seeing your chat working so quickly feels so good&#8230;</p><p>Like riding a horse bareback: raw power moving in the right direction&#8212;no saddle, no reins, no rules.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E7bV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E7bV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!E7bV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!E7bV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!E7bV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E7bV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png" width="357" height="357" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:357,&quot;bytes&quot;:1762698,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!E7bV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!E7bV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!E7bV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!E7bV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0856e4-0c37-4236-a19b-232b4640788f_1024x1024.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><div><hr></div><h2><strong>Until&#8230;</strong></h2><p>&#8230; The horse starts to accelerate&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7cvL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7cvL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png 424w, https://substackcdn.com/image/fetch/$s_!7cvL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png 848w, https://substackcdn.com/image/fetch/$s_!7cvL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png 1272w, https://substackcdn.com/image/fetch/$s_!7cvL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7cvL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png" width="317" height="298.1395881006865" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:874,&quot;resizeWidth&quot;:317,&quot;bytes&quot;:1473961,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!7cvL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png 424w, https://substackcdn.com/image/fetch/$s_!7cvL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png 848w, https://substackcdn.com/image/fetch/$s_!7cvL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.png 1272w, https://substackcdn.com/image/fetch/$s_!7cvL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b4d1ab-03e1-4ad5-8efc-eaabeda12771_874x822.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>Edge cases are found ? </p><p>&#8594; Add an instruction in system prompt</p><p>A wrong join?</p><p>&#8594; Add more schema context.</p><p>A business rule?</p><p>&#8594; Paste a definition.</p><p>Then come the tools.</p><p>At first, there&#8217;s just:</p><ul><li><p>run_query</p></li></ul><p>Then:</p><ul><li><p>list_tables</p></li><li><p>describe_table</p></li><li><p>get_sample_rows</p></li><li><p>metric helpers</p></li><li><p>validation helpers</p></li><li><p>retry helpers</p></li><li><p>&#8230;</p></li></ul><p>Soon, the system prompt is no longer a prompt.</p><p>It&#8217;s a document.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IGoo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IGoo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png 424w, https://substackcdn.com/image/fetch/$s_!IGoo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png 848w, https://substackcdn.com/image/fetch/$s_!IGoo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!IGoo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IGoo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png" width="483" height="477.27272727272725" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1012,&quot;resizeWidth&quot;:483,&quot;bytes&quot;:987788,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!IGoo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png 424w, https://substackcdn.com/image/fetch/$s_!IGoo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png 848w, https://substackcdn.com/image/fetch/$s_!IGoo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!IGoo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efc501a-ace9-4c71-87a6-d940d9d8eec1_1012x1000.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>And because all of this lives in the context window&#8230; Every single LLM call becomes slower, more expensive.</p><p>And even worse: performance starts to degrade. </p><p>You hit the classic &#8220;lost in the middle&#8221; effect where instructions buried in the center of a long prompt are quietly ignored.</p><p>Your LLM doesn&#8217;t get smarter, it gets lost:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tPql!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tPql!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp 424w, https://substackcdn.com/image/fetch/$s_!tPql!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp 848w, https://substackcdn.com/image/fetch/$s_!tPql!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp 1272w, https://substackcdn.com/image/fetch/$s_!tPql!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tPql!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp" width="184" height="200" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:200,&quot;width&quot;:184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;https://media.tenor.com/a-dKVjzm5QwAAAA1/foto.webp&quot;,&quot;title&quot;:&quot;https://media.tenor.com/a-dKVjzm5QwAAAA1/foto.webp&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="https://media.tenor.com/a-dKVjzm5QwAAAA1/foto.webp" title="https://media.tenor.com/a-dKVjzm5QwAAAA1/foto.webp" srcset="https://substackcdn.com/image/fetch/$s_!tPql!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp 424w, https://substackcdn.com/image/fetch/$s_!tPql!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp 848w, https://substackcdn.com/image/fetch/$s_!tPql!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp 1272w, https://substackcdn.com/image/fetch/$s_!tPql!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b0453d-3431-46ef-8dee-a88a0bfd66e5_184x200.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And more broadly, everything feels heavy. Overengineered. You&#8217;re no longer building a product. You&#8217;re maintaining scaffolding.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JDxj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JDxj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png 424w, https://substackcdn.com/image/fetch/$s_!JDxj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png 848w, https://substackcdn.com/image/fetch/$s_!JDxj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png 1272w, https://substackcdn.com/image/fetch/$s_!JDxj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JDxj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png" width="372" height="372.8340807174888" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:894,&quot;width&quot;:892,&quot;resizeWidth&quot;:372,&quot;bytes&quot;:1590009,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!JDxj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png 424w, https://substackcdn.com/image/fetch/$s_!JDxj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png 848w, https://substackcdn.com/image/fetch/$s_!JDxj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png 1272w, https://substackcdn.com/image/fetch/$s_!JDxj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9240beb4-5500-4814-bc09-4e2c02a75dab_892x894.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">F1 Horse</figcaption></figure></div><div><hr></div><p>In 2025 the industry figured this out and teams began to realize something uncomfortable: the problem wasn&#8217;t the model, it was the environment.</p><p>Claude Code showed a different way to build agents &#8212; not by adding more orchestration, but by simplifying the world the model operates in.</p><p>Instead of giant prompts and layered control systems, it relied on:</p><ul><li><p>A filesystem as the primary interface</p></li><li><p>A small set of native Linux tools</p></li></ul><p>No prompt bible. No tool explosion.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VfE3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VfE3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png 424w, https://substackcdn.com/image/fetch/$s_!VfE3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png 848w, https://substackcdn.com/image/fetch/$s_!VfE3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png 1272w, https://substackcdn.com/image/fetch/$s_!VfE3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VfE3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png" width="658" height="285.65202702702703" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:514,&quot;width&quot;:1184,&quot;resizeWidth&quot;:658,&quot;bytes&quot;:744530,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!VfE3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png 424w, https://substackcdn.com/image/fetch/$s_!VfE3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png 848w, https://substackcdn.com/image/fetch/$s_!VfE3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.png 1272w, https://substackcdn.com/image/fetch/$s_!VfE3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32811d3-efbd-42dd-bae3-0501f4a7aa27_1184x514.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>Why did this work so well? Because file systems and Linux CLI tools are deeply embedded in LLM training data. Models have seen: ls, grep, sed, cat millions of times in their training sets.</p><p>They don&#8217;t need to be taught this environment. They already know how to move inside it. You&#8217;re not forcing them to reason in an artificial orchestration layer.</p><div><hr></div><p>So the obvious question is now: What if we applied the same idea to Chat BI?</p><p>This is what the Vercel team did:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hq8G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hq8G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png 424w, https://substackcdn.com/image/fetch/$s_!Hq8G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png 848w, https://substackcdn.com/image/fetch/$s_!Hq8G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png 1272w, https://substackcdn.com/image/fetch/$s_!Hq8G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hq8G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png" width="561" height="250.06112637362637" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:649,&quot;width&quot;:1456,&quot;resizeWidth&quot;:561,&quot;bytes&quot;:101405,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Hq8G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png 424w, https://substackcdn.com/image/fetch/$s_!Hq8G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png 848w, https://substackcdn.com/image/fetch/$s_!Hq8G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.png 1272w, https://substackcdn.com/image/fetch/$s_!Hq8G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ccde458-8485-4dca-9382-a5c50e688587_1970x878.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>They started by implementing a list of super complex tools:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jnWi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jnWi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png 424w, https://substackcdn.com/image/fetch/$s_!jnWi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png 848w, https://substackcdn.com/image/fetch/$s_!jnWi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png 1272w, https://substackcdn.com/image/fetch/$s_!jnWi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jnWi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png" width="569" height="269.25892857142856" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:689,&quot;width&quot;:1456,&quot;resizeWidth&quot;:569,&quot;bytes&quot;:134169,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jnWi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png 424w, https://substackcdn.com/image/fetch/$s_!jnWi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png 848w, https://substackcdn.com/image/fetch/$s_!jnWi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.png 1272w, https://substackcdn.com/image/fetch/$s_!jnWi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa72bba0f-75db-4526-903d-16dc4ca3c516_1458x690.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>And finally decided end of 2025 to remove most of them, and replaced it with:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lPdw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lPdw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png 424w, https://substackcdn.com/image/fetch/$s_!lPdw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png 848w, https://substackcdn.com/image/fetch/$s_!lPdw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png 1272w, https://substackcdn.com/image/fetch/$s_!lPdw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lPdw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png" width="494" height="170.37048192771084" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:458,&quot;width&quot;:1328,&quot;resizeWidth&quot;:494,&quot;bytes&quot;:96996,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!lPdw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png 424w, https://substackcdn.com/image/fetch/$s_!lPdw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png 848w, https://substackcdn.com/image/fetch/$s_!lPdw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png 1272w, https://substackcdn.com/image/fetch/$s_!lPdw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61f819b8-0f02-4247-ab8b-d15ebc7c18d9_1328x458.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The results speak for themselfs:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4I2z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4I2z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png 424w, https://substackcdn.com/image/fetch/$s_!4I2z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png 848w, https://substackcdn.com/image/fetch/$s_!4I2z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png 1272w, https://substackcdn.com/image/fetch/$s_!4I2z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4I2z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png" width="544" height="107.6043956043956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:288,&quot;width&quot;:1456,&quot;resizeWidth&quot;:544,&quot;bytes&quot;:58266,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!4I2z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png 424w, https://substackcdn.com/image/fetch/$s_!4I2z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png 848w, https://substackcdn.com/image/fetch/$s_!4I2z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png 1272w, https://substackcdn.com/image/fetch/$s_!4I2z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff3ff5b-a031-4f1a-a31c-ed37bd9e8bab_1476x292.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Agentic coding flipped the approach, now Chat-BI agent browses files to get insight about semantic, schemas, data strucure and finaly use a query tool to retrieve the data.</p><p>2025 Chat BI systems look like this:</p><ul><li><p>A filesystem</p></li><li><p>Context split across local files</p></li><li><p>A harness</p></li></ul><p>What we call the <em>harness</em> is the set of tools and constraints provided around the LLM.</p><p>The most well-known examples are Claude Code and Codex, but you can also build one easily using frameworks like LangChain / LangGraph.</p><h1>Chat-BI in action </h1><p>So the question now is: how do we bring all of this together into one system?</p><p>For this, we gone use Nao&#8217;s Jaffle Shop <a href="https://github.com/getnao/nao/tree/main/example.">project</a>, which you can start with a single command:</p><pre><code><code>docker run -d \
  --name nao \
  -p 5005:5005 \
  -e BETTER_AUTH_URL=http://localhost:5005 \
  getnao/nao:latest</code></code></pre><p>You then get access to a chat interface running an agent against a DuckDB file.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Oq0v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Oq0v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png 424w, https://substackcdn.com/image/fetch/$s_!Oq0v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png 848w, https://substackcdn.com/image/fetch/$s_!Oq0v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png 1272w, https://substackcdn.com/image/fetch/$s_!Oq0v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Oq0v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png" width="524" height="516.4423076923077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1435,&quot;width&quot;:1456,&quot;resizeWidth&quot;:524,&quot;bytes&quot;:186070,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Oq0v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png 424w, https://substackcdn.com/image/fetch/$s_!Oq0v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png 848w, https://substackcdn.com/image/fetch/$s_!Oq0v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.png 1272w, https://substackcdn.com/image/fetch/$s_!Oq0v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0795181-3250-4132-a425-0cd80faf1c0f_1900x1872.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 project provides a predefined context structured into folders:</p><pre><code><code>  nao/example/
  &#9500;&#9472;&#9472; RULES.md
  &#9500;&#9472;&#9472; docs/
  &#9474;   &#9492;&#9472;&#9472; notion/
  &#9474;       &#9492;&#9472;&#9472; jaffle-shop-information.md
  &#9492;&#9472;&#9472; databases/
      &#9492;&#9472;&#9472; type=duckdb/
          &#9492;&#9472;&#9472; database=jaffle_shop/
              &#9492;&#9472;&#9472; schema=main/
                  &#9492;&#9472;&#9472; table=*/
                      &#9500;&#9472;&#9472; columns.md
                      &#9500;&#9472;&#9472; description.md
                      &#9492;&#9472;&#9472; preview.md</code></code></pre><p>There is, of course, a system prompt, kept intentionally concise (RULES.md):</p><pre><code><code>We are a company that has jaffle shop, we are selling products to our customers. You have to help us to analyze the data and answer questions about the business.

Always be concise and to the point, explain the data and the business logic in a way that is easy to understand. If the user does not give enough details, ask for more details.</code></code></pre><p>The databases/ folder contains metadata about the DuckDB database. For each table, there are three Markdown files:</p><ul><li><p>Column list</p></li></ul><pre><code><code># customers

**Dataset:** `main`

## Columns (7)

- customer_id (int32)
- first_name (string)
- last_name (string)
- first_order (date)
...</code></code></pre><ul><li><p>Descriptions and metadata</p></li></ul><pre><code><code># raw_payments

**Dataset:** `main`

## Table Metadata

| Property | Value |
|----------|-------|
| **Row Count** | 113 |
| **Column Count** | 4 |

## Description

...</code></code></pre><ul><li><p>Data Preview</p></li></ul><pre><code><code># customers - Preview

**Dataset:** `main`

## Rows (10)

- {"customer_id": 1, "first_name": "Michael", "last_name": "P.", "first_order": "2018-01-01 00:00:00", "most_recent_order": "2018-02-10 00:00:00", "number_of_orders": 2, "customer_lifetime_value": 33.0}
- {"customer_id": 2, "first_name": "Shawn", "last_name": "M.", "first_order": "2018-01-11 00:00:00", "most_recent_order": "2018-01-11 00:00:00", "number_of_orders": 1, "customer_lifetime_value": 23.0}</code></code></pre><h2>The Harness</h2><p>For this project, Nao provides its own harness: a set of tools available to the LLM.</p><p>These tools allow the LLM to build its own context by reading files from file system.</p><p>Any coding-oriented harness could work as well: Claude Code, OpenCode, Codex, and others.</p><p>It exposes a small set of tools:</p><ul><li><p><strong>File operations</strong>: list, search, read, grep</p></li><li><p><strong>SQL operations</strong>: execute_sql</p></li><li><p><strong>Rendering</strong>: display_chart</p></li><li><p><strong>UX helpers</strong>: suggest_follow_ups, propose_next_user_questions</p></li></ul><p>These tools are composed into a simple workflow:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aI1C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aI1C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png 424w, https://substackcdn.com/image/fetch/$s_!aI1C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png 848w, https://substackcdn.com/image/fetch/$s_!aI1C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png 1272w, https://substackcdn.com/image/fetch/$s_!aI1C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aI1C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png" width="605" height="596.3571428571429" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:980,&quot;resizeWidth&quot;:605,&quot;bytes&quot;:123680,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aI1C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png 424w, https://substackcdn.com/image/fetch/$s_!aI1C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png 848w, https://substackcdn.com/image/fetch/$s_!aI1C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.png 1272w, https://substackcdn.com/image/fetch/$s_!aI1C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74fa41db-bed0-4620-abc3-6a8449146fd4_980x966.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 model no longer tries to memorize everything inside a single prompt.</p><p>Instead, it navigates a structured environment, explores files, retrieves context when needed and executes SQL only when necessary.</p><h1>Tests</h1><p>Let&#8217;s test a few queries.</p><p>You can see in the screenshots how the agent explores the metadata files before executing the final SQL query.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jCmC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jCmC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png 424w, https://substackcdn.com/image/fetch/$s_!jCmC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png 848w, https://substackcdn.com/image/fetch/$s_!jCmC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png 1272w, https://substackcdn.com/image/fetch/$s_!jCmC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jCmC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png" width="638" height="453.08516483516485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05062179-58fe-4705-9403-e58bda73958b_1608x1142.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1034,&quot;width&quot;:1456,&quot;resizeWidth&quot;:638,&quot;bytes&quot;:202001,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jCmC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png 424w, https://substackcdn.com/image/fetch/$s_!jCmC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png 848w, https://substackcdn.com/image/fetch/$s_!jCmC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.png 1272w, https://substackcdn.com/image/fetch/$s_!jCmC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05062179-58fe-4705-9403-e58bda73958b_1608x1142.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>Now let&#8217;s try more advanced cases.</p><ul><li><p>Non-existent data</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!18-A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!18-A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png 424w, https://substackcdn.com/image/fetch/$s_!18-A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png 848w, https://substackcdn.com/image/fetch/$s_!18-A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png 1272w, https://substackcdn.com/image/fetch/$s_!18-A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!18-A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png" width="526" height="196.52747252747253" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:544,&quot;width&quot;:1456,&quot;resizeWidth&quot;:526,&quot;bytes&quot;:104470,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!18-A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png 424w, https://substackcdn.com/image/fetch/$s_!18-A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png 848w, https://substackcdn.com/image/fetch/$s_!18-A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png 1272w, https://substackcdn.com/image/fetch/$s_!18-A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63ae5139-1729-4c8c-b7b0-ed51dc89c540_1504x562.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p>Ambiguity trap: monthly revenue</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_!8VEe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8VEe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png 424w, https://substackcdn.com/image/fetch/$s_!8VEe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png 848w, https://substackcdn.com/image/fetch/$s_!8VEe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!8VEe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8VEe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png" width="442" height="361.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1190,&quot;width&quot;:1456,&quot;resizeWidth&quot;:442,&quot;bytes&quot;:107385,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!8VEe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png 424w, https://substackcdn.com/image/fetch/$s_!8VEe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png 848w, https://substackcdn.com/image/fetch/$s_!8VEe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!8VEe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03274dd3-ab36-40ea-8644-a97728447565_1542x1260.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>Here are the model&#8217;s &#8220;thought&#8221;:</p><pre><code><code>The user is asking about monthly revenue. I need to query the orders table to get revenue aggregated by month. Let me first check the orders table structure to understand the date column and amount column.

From what I know:
There&#8217;s an orders table
It has order_date and amount columns
I need to group by month and sum the amounts</code></code></pre><p>The model didn&#8217;t use the metric defined in the YAML file. Since &#8220;revenue&#8221; is open to interpretation, it should have either asked for clarification (completed orders only? net revenue excluding returns?), or used the metric definition directly from the YAML.</p><ul><li><p>advanced SQL: </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_!M3eD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M3eD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png 424w, https://substackcdn.com/image/fetch/$s_!M3eD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png 848w, https://substackcdn.com/image/fetch/$s_!M3eD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png 1272w, https://substackcdn.com/image/fetch/$s_!M3eD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M3eD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png" width="436" height="614.9805447470817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1450,&quot;width&quot;:1028,&quot;resizeWidth&quot;:436,&quot;bytes&quot;:223377,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!M3eD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png 424w, https://substackcdn.com/image/fetch/$s_!M3eD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png 848w, https://substackcdn.com/image/fetch/$s_!M3eD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.png 1272w, https://substackcdn.com/image/fetch/$s_!M3eD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229fce93-ecbd-411d-930d-b9d9276707c6_1028x1450.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>Looks good !</p><p>Final try: </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h0cH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h0cH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png 424w, https://substackcdn.com/image/fetch/$s_!h0cH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png 848w, https://substackcdn.com/image/fetch/$s_!h0cH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png 1272w, https://substackcdn.com/image/fetch/$s_!h0cH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h0cH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png" width="465" height="530.6779661016949" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1212,&quot;width&quot;:1062,&quot;resizeWidth&quot;:465,&quot;bytes&quot;:152788,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187515215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!h0cH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png 424w, https://substackcdn.com/image/fetch/$s_!h0cH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png 848w, https://substackcdn.com/image/fetch/$s_!h0cH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.png 1272w, https://substackcdn.com/image/fetch/$s_!h0cH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a963e52-2cd3-41a5-b30e-0cfe62b951d7_1062x1212.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>It failed once &#8212; but eventually produced the correct answer.</p><p>With such a simple schema, it&#8217;s hard to truly push the system to its limits.</p><p>But don&#8217;t worry.</p><p>That&#8217;s exactly what the next posts in this series are for. &#128521;</p><div><hr></div><p><em>I hope this post helped you understand how modern Chat-BI systems are built.</em></p><p><em>This is the first episode of a mini-series we&#8217;re working on with the Nao team, exploring Chat-BI architectures and design patterns.</em></p><p><em>In the coming weeks, we&#8217;ll publish deeper dives on:</em></p><ul><li><p><em>Semantic models and Chat-BI</em></p></li><li><p><em>Context maintenance in agentic systems</em></p></li><li><p><em>The impact of Chat-BI on data roles</em></p></li></ul><p><em>Stay tuned.</em></p><div><hr></div><p>We have released a new episod of our podcast with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;blef&quot;,&quot;id&quot;:29055154,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/173f3e0c-5134-49c2-b824-76e939caa4aa_388x388.jpeg&quot;,&quot;uuid&quot;:&quot;a5574150-92cb-4769-acd4-b753dc29ded8&quot;}" data-component-name="MentionToDOM"></span> (in french). Check it out here:</p><div id="youtube2-JCqlPnBa0uM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;JCqlPnBa0uM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/JCqlPnBa0uM?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p>Thanks for reading,</p><p>Ju</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[If AI Writes the Code, Where’s the Edge?]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 95]]></description><link>https://juhache.substack.com/p/if-ai-writes-the-code-wheres-the</link><guid isPermaLink="false">https://juhache.substack.com/p/if-ai-writes-the-code-wheres-the</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Thu, 12 Feb 2026 13:02:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d3c17172-1ac2-43db-ae69-f687d4c53b0b_684x748.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I&#8217;m Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p>Every week, a new model drops.</p><p>Last week, we even got two.</p><p>Models keep getting better.</p><p>And somehow, so does my anxiety.</p><p>January was a strange month:</p><ul><li><p>Wow moments: crazy productivity gains.</p></li><li><p>Ouch moments: watching more and more of the value chain get eaten by a couple of players.</p></li></ul><p>The question I&#8217;ve been obsessed with lately as a consultant and entrepreneur:</p><p>Where is the value now?</p><p>How do you build anything defensive at all?</p><h1>Software as Specs</h1><p><strong>plan &#8594; implement &#8594; validate</strong></p><p>What&#8217;s becoming clear: there is very little defensible value left in implementation. </p><p>LLM are much better, faster, resilient that us to write code.</p><p>But what about the spec side ?</p><p>LLMs are excellent at doing. They are much worse at structuring.</p><p>If you let them loose without constraints, you get:</p><p>- JSONL files scattered everywhere,</p><p>- massive, unreadable code files,</p><p>- implicit conventions no human would ever agree on,</p><p>- &#8220;it works&#8221; systems nobody dares to touch.</p><p>Why ? </p><p>Because structuring requires understanding a company context, an ecosystem context, and a problem context. That context exists in the real world &#8212; and AI doesn&#8217;t have direct access to it.</p><p>That asymmetry is our edge: we perceive the environment, understand the vision and constraints, and the agent implements the solution. This is likely where a true defensive moat can be built.</p><p>And I think this implies we should rethink how we distribute our knowledge.</p><p>Previously, as consultants or entrepreneurs, we delivered value through code and implementation. Now, perhaps the leverage shifts toward delivering specs &#8212; not the software itself.</p><p>To illustrate this &#8220;spec-only&#8221; shift, I came across an open-source project last weekend that contains &#8230; only four md files:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iHaj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iHaj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png 424w, https://substackcdn.com/image/fetch/$s_!iHaj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png 848w, https://substackcdn.com/image/fetch/$s_!iHaj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png 1272w, https://substackcdn.com/image/fetch/$s_!iHaj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iHaj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png" width="1456" height="351" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:351,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81334,&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://juhache.substack.com/i/187057374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.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_!iHaj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png 424w, https://substackcdn.com/image/fetch/$s_!iHaj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png 848w, https://substackcdn.com/image/fetch/$s_!iHaj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png 1272w, https://substackcdn.com/image/fetch/$s_!iHaj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7751c501-48df-43d6-a5b1-7a2759543033_1718x414.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><a href="https://github.com/strongdm/attractor">Github</a></figcaption></figure></div><p>The provider delivers specification, invariants, constraints, and intent.</p><p>The user (and their agents) handle customization, environment-specific choices, and ownership of the implementation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TLIq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TLIq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png 424w, https://substackcdn.com/image/fetch/$s_!TLIq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png 848w, https://substackcdn.com/image/fetch/$s_!TLIq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!TLIq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TLIq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png" width="393" height="449.6186440677966" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:944,&quot;resizeWidth&quot;:393,&quot;bytes&quot;:125709,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187057374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!TLIq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png 424w, https://substackcdn.com/image/fetch/$s_!TLIq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png 848w, https://substackcdn.com/image/fetch/$s_!TLIq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!TLIq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5373f9-159f-4cac-9538-b74d2d6aaf9a_944x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If implementation is just a commoditized expansion of a plan&#8230; why distribute the expanded form at all?</p><h1>IDE for X</h1><p>In the last 12 months, I&#8217;ve moved from code writer to agent orchestrator.</p><p>This new abstraction has materialized in a shift in my tooling. My development tools have changed focus: from an IDE to an Integrated Review Environment.</p><p>My IDE is now mostly a diff viewer.</p><p>tmux has become my multi-agent chat manager.</p><p>There&#8217;s no reason this evolution should apply only to developers.</p><p>Many SaaS tools today are rigid workflow builders &#8212; forms, and if you&#8217;re lucky, a drag-and-drop canvas.</p><p>But I think there&#8217;s an ocean of opportunity to build workflow-specific, agent-centric environments:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xpu6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xpu6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png 424w, https://substackcdn.com/image/fetch/$s_!xpu6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png 848w, https://substackcdn.com/image/fetch/$s_!xpu6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png 1272w, https://substackcdn.com/image/fetch/$s_!xpu6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xpu6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png" width="626" height="343.5260989010989" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:799,&quot;width&quot;:1456,&quot;resizeWidth&quot;:626,&quot;bytes&quot;:451642,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187057374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!xpu6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png 424w, https://substackcdn.com/image/fetch/$s_!xpu6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png 848w, https://substackcdn.com/image/fetch/$s_!xpu6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.png 1272w, https://substackcdn.com/image/fetch/$s_!xpu6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454f295b-8e87-46f0-9bf9-288823e33b98_2074x1138.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>Such tools would focus on two core tasks:</p><ol><li><p>Context gathering &#8212; collecting files, artifacts, documentation, and rules.</p></li><li><p>AI-generated artifact review &#8212; validating and refining what the agent produces.</p></li></ol><p>For example:</p><ul><li><p>Accountants provide a set of transactions and review the finalized company balance sheet.</p></li><li><p>Marketing teams provide company documentation and review generated content (blog posts, LinkedIn posts, campaign drafts).</p></li><li><p>Doctors input patient observations and review the proposed diagnosis.</p></li><li><p>Teachers upload learning objectives and review the generated teaching materials.</p></li></ul><p>There&#8217;s no reason developers should be the only ones having all the fun &#128578;</p><h1>Inter-agent distribution</h1><p>OpenClaw &#8212; and especially Clawbook &#8212; are showing us something important: a new agent-to-agent market is emerging.</p><p>Right now, only one side of the transaction is truly LLM-powered.</p><p>The user searches for a product through ChatGPT (or another assistant). The demand side is agent-augmented but the supply side is still mostly human-optimized: websites, dashboards, forms, traditional SaaS interfaces.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v-fN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v-fN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png 424w, https://substackcdn.com/image/fetch/$s_!v-fN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png 848w, https://substackcdn.com/image/fetch/$s_!v-fN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png 1272w, https://substackcdn.com/image/fetch/$s_!v-fN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v-fN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png" width="408" height="430.85477178423236" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1018,&quot;width&quot;:964,&quot;resizeWidth&quot;:408,&quot;bytes&quot;:124339,&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://juhache.substack.com/i/187057374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.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_!v-fN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png 424w, https://substackcdn.com/image/fetch/$s_!v-fN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png 848w, https://substackcdn.com/image/fetch/$s_!v-fN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png 1272w, https://substackcdn.com/image/fetch/$s_!v-fN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f7201f7-027b-4580-adbd-3d9d38ff538c_964x1018.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We all understand by now that LLMs are only as good as the context we provide them.</p><p>If an agent has access to your emails, files, Notion, and internal documentation, it becomes dramatically more powerful. It doesn&#8217;t just answer questions &#8212; it acts.</p><p>And this new generation of local-first agents is essentially coding under the hood. Which means they prefer interacting with systems that are agent-native, such as:</p><ul><li><p>CLI interfaces</p></li><li><p>MCP servers</p></li><li><p>API-first services</p></li></ul><p>They don&#8217;t need visual interfaces.</p><p>They need structured, programmable access.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NhXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NhXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png 424w, https://substackcdn.com/image/fetch/$s_!NhXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png 848w, https://substackcdn.com/image/fetch/$s_!NhXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png 1272w, https://substackcdn.com/image/fetch/$s_!NhXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NhXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png" width="321" height="468.98394495412845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1274,&quot;width&quot;:872,&quot;resizeWidth&quot;:321,&quot;bytes&quot;:550142,&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://juhache.substack.com/i/187057374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.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_!NhXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png 424w, https://substackcdn.com/image/fetch/$s_!NhXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png 848w, https://substackcdn.com/image/fetch/$s_!NhXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.png 1272w, https://substackcdn.com/image/fetch/$s_!NhXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffddf611b-faa9-42a2-bbad-90d456d5c829_872x1274.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>When your personal agent researches, compares, or integrates services, it will naturally favor tools that require less effort &#8212; and fewer tokens &#8212; to use.</p><p>That&#8217;s why I think there&#8217;s opportunity in transforming services built around human UIs (web apps, dashboards) into agent-native interfaces (CLI, MCP, APIs).</p><p>The intelligence embedded inside the user&#8217;s agent (Claude Code, local agents, etc.) handles the final-mile customization &#8212; adapting your service to the user&#8217;s specific context.</p><p>That level of personalization &#8212; grounded in the user&#8217;s own data and environment &#8212; is extremely hard to compete with.</p><p>To illustrate this: Stripe is moving in that direction and has released an agent charging feature.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_qy-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_qy-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png 424w, https://substackcdn.com/image/fetch/$s_!_qy-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png 848w, https://substackcdn.com/image/fetch/$s_!_qy-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png 1272w, https://substackcdn.com/image/fetch/$s_!_qy-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_qy-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png" width="411" height="453.8125" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55731474-9ef6-433f-afff-f094c63e11ce_864x954.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:954,&quot;width&quot;:864,&quot;resizeWidth&quot;:411,&quot;bytes&quot;:355642,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/187057374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_qy-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png 424w, https://substackcdn.com/image/fetch/$s_!_qy-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png 848w, https://substackcdn.com/image/fetch/$s_!_qy-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.png 1272w, https://substackcdn.com/image/fetch/$s_!_qy-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55731474-9ef6-433f-afff-f094c63e11ce_864x954.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><div><hr></div><p>So these are the areas where I see opportunity in the coming months.</p><p>I&#8217;m starting to see signals that the market is moving in these directions, as I tried to illustrate with a few examples.</p><p>Let&#8217;s see how it plays out.</p><p>One thing, however, feels certain:</p><p>Value is concentrating in the hands of a small number of companies &#8212; and even individuals.</p><p>And it&#8217;s becoming harder and harder to compete&#8230;</p><div><hr></div><p>I am launching a new podcast with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;blef&quot;,&quot;id&quot;:29055154,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/173f3e0c-5134-49c2-b824-76e939caa4aa_388x388.jpeg&quot;,&quot;uuid&quot;:&quot;fb321936-7bab-497a-a739-beca36bcb2f5&quot;}" data-component-name="MentionToDOM"></span> :)</p><p><strong>The idea?</strong></p><p>Everyone is trying to figure out how to get the most out of all these AI tools.</p><p>With this podcast, we want to share what we&#8217;re discovering &#8212; and invite guests to explain how they use AI in their day-to-day work.</p><p>&#8220;How Do I AI?&#8221;</p><p>The first episode is in French, but we&#8217;ll also be releasing episodes &#8212; and inviting guests &#8212; in English.</p><p>We&#8217;ll keep improving things episode after episode, so don&#8217;t hesitate to share your feedback.</p><div id="youtube2-U82J6Aenmg4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;U82J6Aenmg4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/U82J6Aenmg4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p>Thanks for reading,</p><p>-Ju</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[On the Road to Agent Swarms]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 94]]></description><link>https://juhache.substack.com/p/on-the-road-to-agent-swarms</link><guid isPermaLink="false">https://juhache.substack.com/p/on-the-road-to-agent-swarms</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Fri, 23 Jan 2026 22:22:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/69f93c26-03ce-4928-ba9e-5b5284fa4558_714x886.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I wrote about my agent workflow struggles in last week&#8217;s newsletter:  </p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;51f48159-0442-4ccd-9aa3-062ca904d32a&quot;,&quot;caption&quot;:&quot;Bonjour!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How do you vibe-engineer?&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-01-16T14:43:30.628Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d79896f6-6032-41f8-a7ec-57c2093e5e37_760x668.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/how-do-you-vibe-engineer&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:184639622,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:11,&quot;comment_count&quot;:2,&quot;publication_id&quot;:1211981,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Ev6t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>I found myself trapped in a constant back-and-forth, acting as a manual bridge between different agents.</p><p>I felt less like a developer and more like a manager micromanaging engineers.</p><p>And I don&#8217;t like it.</p><p>It got me obsessed with a single question: how do I scale my agent usage?</p><p>I don&#8217;t want to manage 1&#8211;5 agents in parallel; I want to manage 20 or 30.</p><p>Last Sunday, I came across Steve Yegge&#8217;s <em><a href="https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04">GasTown</a></em> Medium post from early January.</p><p>I remembered reading it before, but it didn&#8217;t click at the time.</p><p>This time, I got that &#8220;aha&#8221; moment (writing last week&#8217;s post probably helped it land).</p><p>So I went down a rabbit hole to understand how the craziest vibe coders on the planet are leveraging coding agents.</p><p>By the end of the month, I want to have good &#8220;agent swarm&#8221; infra in place&#8212;enough to run 20&#8211;30 sessions in parallel.</p><p>In this post, I share what I added to my stack this week and my first exploration of agent orchestration tools.</p><p>If you still need convincing, try watching this:</p><div id="youtube2-zuJyJP517Uw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;zuJyJP517Uw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/zuJyJP517Uw?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h1>What happened this week</h1><h3>I ditched my IDE</h3><p>Yeah, I never thought that would happen&#8230;</p><p>I almost didn&#8217;t open VS Code (or Cursor) this week.</p><p>I run everything in tmux now and can jump super easily across sessions.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wunu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wunu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png 424w, https://substackcdn.com/image/fetch/$s_!Wunu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png 848w, https://substackcdn.com/image/fetch/$s_!Wunu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png 1272w, https://substackcdn.com/image/fetch/$s_!Wunu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wunu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png" width="640" height="174.06593406593407" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:396,&quot;width&quot;:1456,&quot;resizeWidth&quot;:640,&quot;bytes&quot;:145225,&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://juhache.substack.com/i/185535368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.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_!Wunu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png 424w, https://substackcdn.com/image/fetch/$s_!Wunu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png 848w, https://substackcdn.com/image/fetch/$s_!Wunu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png 1272w, https://substackcdn.com/image/fetch/$s_!Wunu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f72e3f1-5a3e-4b73-85ee-ceabd0279edc_3438x934.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>I split each session into panes and windows, which makes it really easy to run several Claude Code sessions in parallel.</p><p>How do I check code? nvim + Neo-tree.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w47R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w47R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png 424w, https://substackcdn.com/image/fetch/$s_!w47R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png 848w, https://substackcdn.com/image/fetch/$s_!w47R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png 1272w, https://substackcdn.com/image/fetch/$s_!w47R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w47R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png" width="401" height="378.967032967033" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1376,&quot;width&quot;:1456,&quot;resizeWidth&quot;:401,&quot;bytes&quot;:186238,&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://juhache.substack.com/i/185535368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.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_!w47R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png 424w, https://substackcdn.com/image/fetch/$s_!w47R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png 848w, https://substackcdn.com/image/fetch/$s_!w47R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png 1272w, https://substackcdn.com/image/fetch/$s_!w47R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1a5a67-e359-436f-ae86-772aa624c149_2292x2166.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">I feel likea true coder now&#8230; but I don&#8217;t write any code :)</figcaption></figure></div><p>How do I check diffs ? directly in GitHub.</p><h2>Beads in the mix</h2><p>As I mentioned in my last post, I was struggling to coordinate multiple agents working on the same problem&#8212;each tackling sub-stories in parallel.</p><p>I started using Beads, and it works pretty well.</p><p>(So well, in fact, that Anthropic seems to have incorporated it directly into Claude Code yesterday.)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PFQa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PFQa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png 424w, https://substackcdn.com/image/fetch/$s_!PFQa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png 848w, https://substackcdn.com/image/fetch/$s_!PFQa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!PFQa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PFQa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png" width="255" height="342.1683673469388" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1052,&quot;width&quot;:784,&quot;resizeWidth&quot;:255,&quot;bytes&quot;:420051,&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://juhache.substack.com/i/185535368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.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_!PFQa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png 424w, https://substackcdn.com/image/fetch/$s_!PFQa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png 848w, https://substackcdn.com/image/fetch/$s_!PFQa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!PFQa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38bc8d3-4fc3-467b-8c34-4fd4caddee4e_784x1052.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>Now I plan first: a quick back-and-forth with an agent until we land on a solid plan using <a href="https://github.com/Fission-AI/OpenSpec">OpenSpec</a>.</p><p>Once the specs are ready, I ask my planning agent to transcribe them into Beads, then let it do 3 back-and-forth rounds with Codex via the Codex CLI.</p><p>Stories are linked in a DAG, so Claude Code can then spin up x sub-agents.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JGAu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JGAu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png 424w, https://substackcdn.com/image/fetch/$s_!JGAu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png 848w, https://substackcdn.com/image/fetch/$s_!JGAu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png 1272w, https://substackcdn.com/image/fetch/$s_!JGAu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JGAu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png" width="495" height="303.94736842105266" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:912,&quot;resizeWidth&quot;:495,&quot;bytes&quot;:81550,&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://juhache.substack.com/i/185535368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.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_!JGAu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png 424w, https://substackcdn.com/image/fetch/$s_!JGAu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png 848w, https://substackcdn.com/image/fetch/$s_!JGAu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.png 1272w, https://substackcdn.com/image/fetch/$s_!JGAu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d085afb-a4c5-495e-859b-2a2f693d983f_912x560.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>With this setup, I&#8217;ve been able to run 5&#8211;10 sessions in parallel.</p><p>And honestly, it&#8217;s been working pretty well&#8212;but I still need to jump in too often:</p><p>Things aren&#8217;t properly tested.</p><p>Simple bugs go through.</p><p>Simple architecture decisions aren&#8217;t made.</p><p>And these stupid permission requests&#8230; Speaking of witch: </p><h3>Sandboxing: no clean solution</h3><p>I tested the sandboxing solution in Claude Code, but it was too restrictive&#8212;for example, the agent couldn&#8217;t access localhost.</p><p>So I ended up using the --allow-dangerously-skip-permissions flag. </p><p>It works great, but it doesn&#8217;t feel very&#8230; safe.</p><p>Any tips?</p><h3>Browser Interaction </h3><p>I started to use <a href="https://github.com/vercel-labs/agent-browser">broser-agent</a> from Vercel and it&#8217;s really good, much faster than claude code chrome feature.</p><h1>Next Week, Next Level</h1><p>Next week, I want to take this setup to the next level.</p><p>To do that, I looked into a few agent orchestration frameworks:</p><p>- <a href="https://github.com/dlorenc/multiclaude">multiclaude</a> (312 &#11088;)</p><p>- <a href="https://github.com/steveyegge/gastown">GasTown</a> (5.2k &#11088;)</p><p>- <a href="https://github.com/ruvnet/claude-flow">claude-flow</a> (12.6k &#11088;) </p><p>I don&#8217;t want to describe them in detail in this post but instead understand how they solve these problems:</p><ul><li><p>Coordination</p></li><li><p>Parallel Execution</p></li><li><p>Merging</p></li></ul><p>Let&#8217;s go !</p><h2>Coordination &amp; Task Tracking</h2><p>All three projects follow a similar approach: one agent has a dedicated planning role&#8212;it pulls the current open tasks and assigns them.</p><p><strong>Multiclaude</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_!tSV_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tSV_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png 424w, https://substackcdn.com/image/fetch/$s_!tSV_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png 848w, https://substackcdn.com/image/fetch/$s_!tSV_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png 1272w, https://substackcdn.com/image/fetch/$s_!tSV_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tSV_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png" width="500" height="307.4596774193548" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:610,&quot;width&quot;:992,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:73725,&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://juhache.substack.com/i/185535368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.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_!tSV_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png 424w, https://substackcdn.com/image/fetch/$s_!tSV_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png 848w, https://substackcdn.com/image/fetch/$s_!tSV_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.png 1272w, https://substackcdn.com/image/fetch/$s_!tSV_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8784cb9-ab75-4cee-8762-9bd27a56e414_992x610.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>Agents communicate by writing messages to files.</p><p>The planner drops tasks into each worker&#8217;s folder. A daemon prompts workers to check for new tasks; they execute them and write results back.</p><p>No fancy tools&#8212;just files and polling.</p><p><strong>GasTown</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_!r6cM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r6cM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png 424w, https://substackcdn.com/image/fetch/$s_!r6cM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png 848w, https://substackcdn.com/image/fetch/$s_!r6cM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png 1272w, https://substackcdn.com/image/fetch/$s_!r6cM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r6cM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png" width="503" height="244.73084886128365" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:470,&quot;width&quot;:966,&quot;resizeWidth&quot;:503,&quot;bytes&quot;:46375,&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://juhache.substack.com/i/185535368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.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_!r6cM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png 424w, https://substackcdn.com/image/fetch/$s_!r6cM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png 848w, https://substackcdn.com/image/fetch/$s_!r6cM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png 1272w, https://substackcdn.com/image/fetch/$s_!r6cM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01abc09f-9a24-4307-b46f-fc5c78e897cb_966x470.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Agents exchange messages and do not get polluted by others</figcaption></figure></div><p>GasTown uses a dedicated MCP mail system.</p><p>Each agent gets a mailbox and can send/receive messages via that MCP mailbox.</p><p>GasTown uses this for all communication:</p><ul><li><p>Agent starts &#8594; a hook reads the inbox &#8594; picks up work.</p></li><li><p>Done &#8594; the agent updates the inbox.</p></li></ul><p>Agents don&#8217;t talk to each other directly&#8212;only via mail&#8212;so each agent&#8217;s context stays clean and doesn&#8217;t get polluted.</p><p><strong>Claude-Flow</strong></p><p>Claude-flow, on the other end of the spectrum, is more complex:</p><p>No files, no mail&#8212;everything is coordinated in memory by a hierarchy of planner agents.</p><p>A strategic planner breaks work down into tasks, and a router assigns each one to the best worker, learning over time which agent type performs best.</p><p>Workers claim tasks from a shared registry. If an agent dies, the task is released and picked up by another worker.</p><h2>Parallel Execution &amp; Isolation</h2><p>20 agents touching the same codebase = chaos.</p><p>Multiclaude and GasTown avoid that by leaning on Git worktrees.</p><p>For each feature, the planning agent:</p><ul><li><p>creates a worktree in a central location (e.g., ~/.multiclaude/ or ~/gt/)</p></li><li><p>creates a dedicated tmux session</p></li></ul><p>Claude-flow takes a different approach:</p><p>No worktrees&#8212;just a shared codebase, where agents claim tasks. </p><p>A claim means: &#8220;I&#8217;m working on this, don&#8217;t touch it.&#8221;</p><p>If an agent dies, the claim is released and another agent can pick the task up.</p><h2>Diff Merging</h2><p>20 agents = 20 branches.</p><p>How do changes land in main?</p><p>This &#8220;merge wall&#8221; gets brutal at 20+ parallel workers: every merge shifts the baseline, and later PRs end up targeting code that&#8217;s already changed.</p><p><strong>Multiclaude</strong></p><p>The Multiclaude philosophy puts CI front and center.</p><p>If it passes, the code goes in&#8212;and the next PRs need to adapt.</p><p>The resolution workflow looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QAJG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QAJG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png 424w, https://substackcdn.com/image/fetch/$s_!QAJG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png 848w, https://substackcdn.com/image/fetch/$s_!QAJG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png 1272w, https://substackcdn.com/image/fetch/$s_!QAJG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QAJG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png" width="585" height="271.8181818181818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:460,&quot;width&quot;:990,&quot;resizeWidth&quot;:585,&quot;bytes&quot;:47775,&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://juhache.substack.com/i/185535368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.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_!QAJG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png 424w, https://substackcdn.com/image/fetch/$s_!QAJG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png 848w, https://substackcdn.com/image/fetch/$s_!QAJG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.png 1272w, https://substackcdn.com/image/fetch/$s_!QAJG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b89e9e-b55c-4712-9319-52f4f7d07861_990x460.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 daemon regularly asks the planner to check PR status. </p><p>If it detects a failing PR, the planner assigns the fix to the original worker.</p><p><strong>GasTown</strong></p><p>GasTown, on its end, leverages Beads queues. </p><p>Each time a worker finishes, it pushes to GitHub and adds a new message to the review queue.</p><p>A dedicated agent, running in its own worktree, polls the review queue, merges PRs that can be merged, and sends a message to the planning agent if conflicts occur.</p><p>The planning agent then asks the initial worker to resolve them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mPCo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mPCo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.png 424w, https://substackcdn.com/image/fetch/$s_!mPCo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.png 848w, https://substackcdn.com/image/fetch/$s_!mPCo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.png 1272w, https://substackcdn.com/image/fetch/$s_!mPCo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mPCo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.png" width="548" height="278.94188376753505" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/679b0689-415b-4de6-9213-d68be222f2c8_998x508.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:508,&quot;width&quot;:998,&quot;resizeWidth&quot;:548,&quot;bytes&quot;:52189,&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://juhache.substack.com/i/185535368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.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_!mPCo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.png 424w, https://substackcdn.com/image/fetch/$s_!mPCo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.png 848w, https://substackcdn.com/image/fetch/$s_!mPCo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.png 1272w, https://substackcdn.com/image/fetch/$s_!mPCo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F679b0689-415b-4de6-9213-d68be222f2c8_998x508.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>Claude-flow takes a different approach: no branches, no worktrees, just a shared codebase coordinated through task claims. </p><p>Agents claim work to avoid conflicts, propose changes, and rely on a consensus mechanism&#8212;rather than Git&#8212;to decide what gets merged.</p><div><hr></div><p>I have limited experience with these frameworks so far, but it&#8217;s interesting to see where the real problems are&#8212;and how they&#8217;re being solved today.</p><p>Some solutions might be over-complexified, but they still offer a lot of ideas you can borrow and implement in your own workflows.</p><p>One thing is clear: agents need to communicate with each other, especially for conflict resolution.</p><p>That&#8217;s a key piece, and I really like the mail MCP approach. It&#8217;s an elegant solution that could scale to team collaboration as well. If one developer has 20 agents working on a repo, then a team of 5 has ~100 agents on the same codebase&#8230; that&#8217;s a <em>lot</em> of conflicts to resolve &#128517;</p><p>Within a few months, Claude Code and Codex will probably integrate these patterns natively, hiding most of the complexity from the user. </p><p>What I&#8217;m less sure about is whether they&#8217;ll allow orchestration across providers&#8212;which I think has a lot of value, for example:</p><ul><li><p>easy tasks for OSS models</p></li><li><p>hard tasks for Codex</p></li><li><p>regular implementation work for Claude Code</p></li></ul><p>Finally, all of this is currently centered around pure software engineering. </p><p>But in the data world, what does it mean to have dozens of agents running in parallel?</p><p>I see only one way: truly adopt git-for-data approaches across the stack and properly isolate agents.</p><div><hr></div><p>Thanks for reading,</p><p>-Ju</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"></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[How do you vibe-engineer?]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 93]]></description><link>https://juhache.substack.com/p/how-do-you-vibe-engineer</link><guid isPermaLink="false">https://juhache.substack.com/p/how-do-you-vibe-engineer</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Fri, 16 Jan 2026 14:43:30 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d79896f6-6032-41f8-a7ec-57c2093e5e37_760x668.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I&#8217;m Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p>Everyone&#8217;s coding workflow has changed in the last few months: </p><p>copy-pasting &#8594; inline completion &#8594; agent.</p><p>The web is full of hype, and it&#8217;s hard to separate signal from noise.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E9L0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E9L0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png 424w, https://substackcdn.com/image/fetch/$s_!E9L0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png 848w, https://substackcdn.com/image/fetch/$s_!E9L0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png 1272w, https://substackcdn.com/image/fetch/$s_!E9L0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E9L0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png" width="453" height="404.0529661016949" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:842,&quot;width&quot;:944,&quot;resizeWidth&quot;:453,&quot;bytes&quot;:290599,&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://juhache.substack.com/i/184639622?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.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_!E9L0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png 424w, https://substackcdn.com/image/fetch/$s_!E9L0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png 848w, https://substackcdn.com/image/fetch/$s_!E9L0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.png 1272w, https://substackcdn.com/image/fetch/$s_!E9L0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e3d0b8-bcf8-41e0-a89a-9d4a7fbbf23c_944x842.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>I&#8217;ve been experimenting a lot lately across personal projects, open source, and client work. </p><p>I&#8217;m convinced we now have genuinely powerful tools in our hands&#8212;while all of us are still figuring out how to use them well.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HTDE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HTDE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png 424w, https://substackcdn.com/image/fetch/$s_!HTDE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png 848w, https://substackcdn.com/image/fetch/$s_!HTDE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!HTDE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HTDE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png" width="420" height="370.7586206896552" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1160,&quot;resizeWidth&quot;:420,&quot;bytes&quot;:315517,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/184639622?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.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_!HTDE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png 424w, https://substackcdn.com/image/fetch/$s_!HTDE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png 848w, https://substackcdn.com/image/fetch/$s_!HTDE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!HTDE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0b83-e33f-4464-b346-b64fa580c05a_1160x1024.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So I want to use this newsletter to share practical tips and tricks.</p><p>Here&#8217;s my ask: </p><blockquote><p>How do you vibe-engineer?</p></blockquote><p>The goal isn&#8217;t to deliver thousands of AI coding insights&#8212;it&#8217;s to start a conversation in the comments and learn from each other.</p><p>I&#8217;d love to hear from your experience: comment below or reply to this email with your best tips and tricks.</p><p>I&#8217;ll share the best insights I receive in future newsletter issues.</p><h1>My Stack</h1><h2>The IDE Journey</h2><p>I&#8217;ve been using VS Code for years, but this past year has been a bit of a rollercoaster.</p><p>I switched to Cursor in 2024. </p><p>Then over the summer, it started crashing my machine&#8212;most likely because I opened a project that was simply too large.</p><p>Unlike Claude Code or Codex, Cursor indexes your entire project to enable semantic search. </p><p>Claude Code and Codex, on the other hand, rely more on grep and other CLI tools.</p><p>That approach is probably slower in some cases, but it can be more efficient in terms of output and long-term maintenance (this Vercel <a href="https://vercel.com/blog/we-removed-80-percent-of-our-agents-tools">post</a> is a good illustration).</p><p>I&#8217;ll write more about agent tooling this in the coming weeks.</p><p>After the Cursor incident, I went back to VS Code, and I&#8217;ve been using it ever since.</p><h2>The Agent: Claude Code</h2><p>I started on the Pro plan, but I hit the limits pretty quickly&#8212;so I upgraded to Max ($200/month).</p><p>If you&#8217;re considering the $100 plan: from what I&#8217;ve seen, it&#8217;s intentionally restrictive and tends to nudge you toward Max. </p><p>If you use it heavily, you&#8217;ll probably end up upgrading anyway.</p><p>That said, I use it now for everything&#8212;coding, project management, company management, admin tasks.</p><p>So for my personal case, the price is worth it.</p><p>Since late December / early January, the output quality has jumped a lot with the latest Opus 4.5 release.</p><p>Everything suddenly got&#8230; better.</p><p>Less fighting. Fewer retries. More tasks done in one shot.</p><h2>The Shift: Local-First Everything</h2><p>Here&#8217;s where things got interesting.</p><p>Last year, I started stripping out cloud tools:</p><ul><li><p>I killed Notion</p></li><li><p>Stopped using Google Sheets and Drive</p></li></ul><p>I vibe-engineered a custom CLI for accounting. I built a habit tracker that runs on a my Tailscale network.</p><p>Everything became local.</p><p>All invoices and reports are Markdown files. When I need a database to power a web app, I just use SQLite.</p><p>And after getting tired of having 10&#8211;15 VS Code windows open at the same time, I even tried going full tmux + Neovim.</p><p>But I gave up.</p><p>My brain is just too wired for VS Code, and I&#8217;m too lazy to accept the short-term productivity loss.</p><h2>Tips &amp; Tricks</h2><p>Here&#8217;s an unstructured list of tips and tricks&#8212;patterns I&#8217;ve seen work.</p><h2>Plan Mode - Don&#8217;t Be Lazy</h2><p>I&#8217;ve noticed Claude wants to DO DO DO. It&#8217;s eager. It wants to start writing code immediately.</p><p>My role as the coder is to BREAK BREAK BREAK.</p><p>What works for me is forcing planning first. I spend a lot of time scoping the requirements. Plan time is where we add the most value.</p><p>The more detailed the specs, the better the output.</p><p>I&#8217;ve also noticed that when I&#8217;m tired at the end of the day, I tend to let things slide too easily&#8212;and I regret it later.</p><p>The potential impact of being tired at work is way higher now than it used to be :)</p><h2>Multi-Agent on Same Branch</h2><p>I let multiple agents work on the same branch. It sounds messier in theory, but I&#8217;ve found it cleaner in practice.</p><p>A lot of people recommend using worktrees. I do sometimes&#8212;but once you run multiple worktrees, you often end up re-building your local setup each time.</p><p>So I only create worktrees when I really need true isolation.</p><p>What I do instead: I tell my agents, &#8220;commit ONLY your changes.&#8221;</p><p>You can even create a slash command for that:</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://x.com/i/status/2007179832300581177)).&quot;,&quot;full_text&quot;:&quot;I'm Boris and I created Claude Code. Lots of people have asked how I use Claude Code, so I wanted to show off my setup a bit.\n\nMy setup might be surprisingly vanilla! Claude Code works great out of the box, so I personally don't customize it much. There is no one correct way to&quot;,&quot;username&quot;:&quot;bcherny&quot;,&quot;name&quot;:&quot;Boris Cherny&quot;,&quot;profile_image_url&quot;:&quot;https://pbs.substack.com/profile_images/1902044548936953856/J2jeik0t_normal.jpg&quot;,&quot;date&quot;:&quot;2026-01-02T19:58:58.000Z&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:1246,&quot;retweet_count&quot;:6606,&quot;like_count&quot;:51885,&quot;impression_count&quot;:7465526,&quot;expanded_url&quot;:null,&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>I think the problem here is that agents are not aware of what the others are working on, but knowing they can isolate their changes and commit only when needed helps.</p><p>I&#8217;m still searching for the best setup for this problem.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BYA1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BYA1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png 424w, https://substackcdn.com/image/fetch/$s_!BYA1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png 848w, https://substackcdn.com/image/fetch/$s_!BYA1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png 1272w, https://substackcdn.com/image/fetch/$s_!BYA1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BYA1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png" width="482" height="264.3481116584565" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:668,&quot;width&quot;:1218,&quot;resizeWidth&quot;:482,&quot;bytes&quot;:198667,&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://juhache.substack.com/i/184639622?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.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_!BYA1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png 424w, https://substackcdn.com/image/fetch/$s_!BYA1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png 848w, https://substackcdn.com/image/fetch/$s_!BYA1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png 1272w, https://substackcdn.com/image/fetch/$s_!BYA1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa3bb673-f5f3-48ae-89b4-af597c992d6b_1218x668.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://x.com/BHolmesDev/status/2010189144123998669">Link</a></figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XqYR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XqYR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png 424w, https://substackcdn.com/image/fetch/$s_!XqYR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png 848w, https://substackcdn.com/image/fetch/$s_!XqYR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png 1272w, https://substackcdn.com/image/fetch/$s_!XqYR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XqYR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png" width="458" height="299.929203539823" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:444,&quot;width&quot;:678,&quot;resizeWidth&quot;:458,&quot;bytes&quot;:109084,&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://juhache.substack.com/i/184639622?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.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_!XqYR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png 424w, https://substackcdn.com/image/fetch/$s_!XqYR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png 848w, https://substackcdn.com/image/fetch/$s_!XqYR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png 1272w, https://substackcdn.com/image/fetch/$s_!XqYR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd1be75e-83cb-4e62-98dc-71a7e2fcd0da_678x444.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The <a href="https://x.com/doodlestein/status/2010395079937040487">claim</a> is probably exaggerated&#8212;but there&#8217;s likely still something to learn from it.</figcaption></figure></div><h2>&#8220;SIMPLIFY !!!&#8221;</h2><p>I keep <s>telling</s> yelling at the agent: simplify.</p><p>It&#8217;s not for no reason that Anthropic released a <a href="https://github.com/anthropics/claude-code/blob/main/plugins/pr-review-toolkit/agents/code-simplifier.md">code-simplifier </a>subagent.</p><p>Every time I end up in a &#8220;simplification review,&#8221; I realize my original plan wasn&#8217;t good enough.</p><p>And yes&#8212;you&#8217;ve probably noticed it too: review is now critical.</p><p>To tie this back to the first point, engineers add the most value at:</p><ul><li><p>design time</p></li><li><p>review time</p></li></ul><p>For this review process, I accumulate notes in CLAUDE.md.</p><p>Over time, the agent gets higher-quality context, which steadily improves the output.</p><p>After a session, I ask Claude Code to look up the session transcript in <code>~/.claude</code> (sessions) and extract the useful bits into <code>CLAUDE.md</code>: how we solved bugs, architecture decisions, bugs we found, coding patterns, etc.</p><p>For workflow-oriented memory&#8212;how to do stuff&#8212;I create <a href="https://code.claude.com/docs/en/skills">skills</a>.</p><p>For company management and other admin workflows, that&#8217;s been especially helpful.</p><h2>PoC Mode</h2><p>A good pattern I&#8217;ve found is to run PoCs in an isolated environment.</p><p>Instead of confusing the agent with the rest of the codebase, I let it try a new tool or a new design in a dedicated folder first. This works really well.</p><p>Agents are also great at copying patterns, so having a reference implementation PoC becomes a solid guideline&#8212;and helps avoid it getting lost during the full implementation.</p><p>Starting fresh like this (globally) has always given me good results.</p><h2>Coding in 2026 = Building Agent Loop</h2><p>I&#8217;ve gotten good results by designing agent tasks where the agent can evaluate its output against a clear baseline&#8212;tests that must pass, expected UI behavior, or target values.</p><p>Building these loops:</p><ul><li><p>forces you to think in terms of <em>output</em> instead of &#8220;how&#8221;</p></li><li><p>lets the agent run longer (and more autonomously)</p></li></ul><p>Good engineers in 2026 will probably be the ones who master designing agent loops&#8212;and who get creative about how to define the baseline.</p><h2>Multi-Model Loop (Claude + GPT)</h2><p>I&#8217;d seen some Codex hype, so I decided to try it.</p><p>Codex is actually really good at:</p><ul><li><p>architecture analysis</p></li><li><p>code review</p></li><li><p>hard problems where Claude Code gets stuck</p></li></ul><p>I started on the $20 plan and I&#8217;m pretty happy with it.</p><p>Now I&#8217;m constantly copy-pasting messages back and forth between the two panels:</p><ul><li><p>&#8220;review this&#8221;</p></li><li><p>&#8220;write detailed specs&#8221;</p></li><li><p>&#8220;why did this fail?&#8221;</p></li><li><p>&#8220;what are the edge cases?&#8221;</p></li><li><p>etc.</p></li></ul><p>This is also an area where I see a lot of potential: getting Claude Code and Codex to talk to each other in a loop until they converge on a good state&#8212;then I can jump in and make the final call.</p><p>I found this project that might be a good option:</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://x.com/jarrodwatts/status/2009963629500870977&quot;,&quot;full_text&quot;:&quot;Introducing Claude Delegator!\n\nA Claude Code plugin that lets you use GPT 5.2 powered subagents directly within Claude Code.\n\nAsk GPT 5.2 (via codex) to architect your code, perform security audits, or make any other changes to your codebase.\n\nEasy installation guide below &#8595; &quot;,&quot;username&quot;:&quot;jarrodwatts&quot;,&quot;name&quot;:&quot;Jarrod Watts&quot;,&quot;profile_image_url&quot;:&quot;https://pbs.substack.com/profile_images/1819808474215182337/j4exNg5D_normal.jpg&quot;,&quot;date&quot;:&quot;2026-01-10T12:20:47.000Z&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/G-TSIExasAMoaVT.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/9Wf0OX2399&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:95,&quot;retweet_count&quot;:146,&quot;like_count&quot;:1888,&quot;impression_count&quot;:154021,&quot;expanded_url&quot;:null,&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>But what I&#8217;d like is a YAML-based interface for orchestrating coding agents.</p><pre><code>agents:
  builder:
    provider: claude_code
    model: opus
    prompt:
      - ""

  reviewer:
    provider: codex
    model: latest
    prompt:
      - ""

....</code></pre><p>&#8230;but the hard part is probably that this kind of DSL isn&#8217;t easy to generalize.</p><p>This is more or less the approach used by the Wiggum Loop.</p><p>The idea here is brutally simple: just let Claude Code run in a loop until it reaches a good state.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://x.com/mattpocockuk/status/2008200878633931247&quot;,&quot;full_text&quot;:&quot;My Ralph Wiggum breakdown went viral.\n\nIt's a keep-it-simple-stupid approach to AI coding that lets you ship while you sleep.\n\nSo here's a full explanation, example code, and demo. &quot;,&quot;username&quot;:&quot;mattpocockuk&quot;,&quot;name&quot;:&quot;Matt Pocock&quot;,&quot;profile_image_url&quot;:&quot;https://pbs.substack.com/profile_images/1666460461884211204/SmBm505D_normal.jpg&quot;,&quot;date&quot;:&quot;2026-01-05T15:36:14.000Z&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://substackcdn.com/image/upload/w_1028,c_limit,q_auto:best/l_twitter_play_button_rvaygk,w_88/ctufkgd3aukvgptdvngh&quot;,&quot;link_url&quot;:&quot;https://t.co/FyVdrIyqUP&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:208,&quot;retweet_count&quot;:361,&quot;like_count&quot;:4775,&quot;impression_count&quot;:559693,&quot;expanded_url&quot;:null,&quot;video_url&quot;:&quot;https://video.twimg.com/amplify_video/2008199065901703168/vid/avc1/1280x720/-HF-m7BgnzYTAJyy.mp4&quot;,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Claude Code even released an official <a href="https://github.com/anthropics/claude-code/tree/main/plugins/ralph-wiggum">plugin</a> for it.</p><p>I haven&#8217;t tested this yet, but I think agent orchestration is going to be a pretty interesting topic over the next few months.</p><h2>Frontend: Browser Control</h2><p>For frontend tasks, I&#8217;ve seen big efficiency gains using the <code>claude --chrome</code> extension.</p><p>I let Claude Code iterate on the code, start the dev server, and pull console logs directly from the browser. It can also use screenshots to get visual feedback from the UI.</p><p>That said, I&#8217;ve found it pretty slow.</p><h1>To-Test List</h1><p>I haven&#8217;t tested it yet, but this project keeps popping up in my feeds&#8212;and it&#8217;s currently #1 on my list:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x-7w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x-7w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png 424w, https://substackcdn.com/image/fetch/$s_!x-7w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png 848w, https://substackcdn.com/image/fetch/$s_!x-7w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png 1272w, https://substackcdn.com/image/fetch/$s_!x-7w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x-7w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png" width="591" height="251.74043261231282" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1202,&quot;resizeWidth&quot;:591,&quot;bytes&quot;:97134,&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://juhache.substack.com/i/184639622?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.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_!x-7w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png 424w, https://substackcdn.com/image/fetch/$s_!x-7w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png 848w, https://substackcdn.com/image/fetch/$s_!x-7w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png 1272w, https://substackcdn.com/image/fetch/$s_!x-7w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb28cc905-ec15-488c-bf6d-5cffa204c22e_1202x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://github.com/steveyegge/beads">github</a></figcaption></figure></div><p>As I mentioned above, my main area of experimentation right now is multi-agent orchestration&#8212;getting multiple agents to collaborate around a shared source of truth. I think Beads could help a lot with that.</p><div><hr></div><p>I&#8217;m curious:</p><p>- What&#8217;s your stack? (IDE, model, workflow)</p><p>- What one trick changed everything for you?</p><p>- What overhyped thing actually doesn&#8217;t work for you</p><p>How to share:</p><p>- Drop in comments below</p><p>- Email me: respond to this email</p><p>I&#8217;ll compile the insights in the next newsletter release!</p><p>Thanks a lot !</p><div><hr></div><p>Thanks for reading,</p><p>-Ju</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"></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[The Boring Engineer Manifesto]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 92]]></description><link>https://juhache.substack.com/p/boring-engineering-manifesto</link><guid isPermaLink="false">https://juhache.substack.com/p/boring-engineering-manifesto</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Fri, 09 Jan 2026 12:31:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0c24e022-dff9-4ef0-a3c9-3ace51dadcab_894x516.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I&#8217;m Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p>Last year, I published less than usual: 14 posts.</p><p>Not because I ran out of ideas &#8212; but because I was busy building:</p><ul><li><p>Helped 6 data teams build data platforms (some with AI, some without &#8212; still possible in 2025 &#128521;)</p></li><li><p>Shipped my first public products and OSS projects:</p><ul><li><p><a href="https://www.boringdata.io/">Boring Data</a> &#8212; Terraform data stack templates</p></li><li><p><a href="https://github.com/boringdata/boring-catalog">Boring-catalog</a> &#8212; file-based Iceberg catalog</p></li><li><p><a href="https://github.com/boringdata/boring-semantic-layer">Boring-semantic-layer</a> &#8212; Ibis-based semantic layer</p></li><li><p>kurt &#8212; an IDE for writers (more on this soon)</p></li></ul></li></ul><p>Across all these projects, I had to make a lot of design decisions.</p><p>During the end-of-year break &#8212; helped by Miami&#8217;s sunny vibes &#127796; &#8212; I reflected on:</p><ul><li><p>what actually worked</p></li><li><p>what didn&#8217;t</p></li><li><p>and the patterns I keep seeing over and over again</p></li></ul><p>This post is less technical than usual.</p><p>I attempt to formalize the Boring philosophy.</p><p>(Slightly ironic to write this in a not-so-boring city &#128516;)</p><h2>1 &#8212; Why Boring?</h2><p>Because complexity is the default tendency of most engineering projects I see&#8212;mine included.</p><p>Not because teams are bad.</p><p>Not because engineers are careless.</p><p>But because of our constant craving for tools.</p><p>As a result, complexity naturally accumulates:</p><ul><li><p>every new tool solves a local problem</p></li><li><p>most tools eventually become obsolete</p></li><li><p>every vendor wants to <em>be</em> the vendor (aka platforms)</p></li><li><p>every abstraction hides a detail&#8230; and introduces another</p></li></ul><p>And let&#8217;s be honest: vendors are really good at developer marketing &#128578;</p><p>This marketing-driven push nudges the industry into ideological dilemmas:</p><ul><li><p>OSS vs SaaS</p><p>&#8220;Just use X, reduce TCO&#8221; vs &#8220;Vendor lock-in is evil&#8221;.</p></li><li><p>Snowflake vs Databricks</p><p>(no comment &#128517;)</p></li><li><p>Cloud vs on-prem</p><p>&#8220;Just use managed services&#8212;100 engineers worked on this button&#8221;. </p><p>vs </p><p>&#8220;AWS is down? I don&#8217;t care, I spent hundreds of days building my own setup&#8221;</p></li></ul><p>The problem isn&#8217;t that these debates are wrong.</p><p>It&#8217;s that they&#8217;re often argued without context, which makes it extremely hard, as an engineer, to pick the right tool for the right situation.</p><h2>2 &#8212; What Boring Engineering Is Not</h2><p>Boring Engineering is not:</p><ul><li><p>anti-innovation / conservative</p></li><li><p>anti-SaaS</p></li><li><p>anti-cloud</p></li><li><p>anti-complex systems</p></li></ul><p>Boring Engineering puts complexity where you can reason about it and maintain it.</p><p>Not where only the original author can.</p><h2>3 &#8212; My Mistakes</h2><h3>Mistake 1: Picking a tool too early</h3><p>Demos always look good.</p><p>Tools always have edge cases&#8212;hidden corners.</p><p>So now I default to proven, boring choices&#8212;until the problem demands otherwise.</p><p>Here&#8217;s what my current default stack looks like:</p><ul><li><p>Code interfaces? Python</p></li><li><p>Compute? a Linux VM + DuckDB</p></li><li><p>Storage? S3 bucket</p></li><li><p>ELT? dlt</p></li><li><p>Application database? PostgreSQL</p></li><li><p>Collaborative data platforms? Snowflake or Databricks</p></li><li><p>To-do app? A piece of paper in my pocket</p></li><li><p>Car? Renault Kangoo ^^</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7G-Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7G-Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7G-Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7G-Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7G-Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7G-Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg" width="346" height="259.2623626373626" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1091,&quot;width&quot;:1456,&quot;resizeWidth&quot;:346,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;RENAULT KANGOO - Occasionen kaufen | MotoScout24&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="RENAULT KANGOO - Occasionen kaufen | MotoScout24" title="RENAULT KANGOO - Occasionen kaufen | MotoScout24" srcset="https://substackcdn.com/image/fetch/$s_!7G-Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7G-Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7G-Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7G-Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1415bdd-4041-49fa-9bee-ef5972232a09_1920x1439.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></li></ul><h3>Mistake 2: Over-generalizing a solution</h3><p>I&#8217;ve repeatedly tried to design &#8220;generic&#8221; solutions that would cover every future use case.</p><p>In practice, this often resulted in:</p><ul><li><p>poor or useless interfaces</p></li><li><p>complexity hidden behind overly implicit abstractions</p></li><li><p>systems that were hard to understand, extend, or debug</p></li></ul><p>Trying to hide complexity doesn&#8217;t remove it&#8212;it just moves it to places where users have less control.</p><p>This is what I&#8217;m trying to achieve with the boring-* projects:</p><ul><li><p>easy to install (e.g. pip install &#8230;)</p></li><li><p>no Docker required </p></li><li><p>smart defaults that work on day one, but can be tweaked later</p></li><li><p>ideally written in Python, making them easy for users to customize</p></li></ul><p>Boring tools are designed to:</p><ul><li><p>be learned in minutes, not weeks</p></li><li><p>fade into the background once adopted</p></li></ul><p>If learning the tool becomes the work, the tool <em>is</em> the problem</p><p>(yes, certifications&#8230;)</p><h3>Mistake 3: Designing for a future that never arrived</h3><p>&#8220;We can scale to hundreds of terabytes.&#8221;</p><p>I&#8217;ve said it. I&#8217;ve built for it.</p><p>In many projects, features I was proud of later turned out to be over-engineered for scale (yes, Spark &#128517;).</p><p>The reality is simpler.</p><p>This is the core DuckDB message: a single node is good enough for a very large share of data workflows&#8212;in 99% of companies.</p><p>And this isn&#8217;t just theory. </p><p>I&#8217;ve verified it repeatedly across client projects.</p><h2>From archi-tech to archi-preneur</h2><p>The core of the Boring philosophy is being output-driven first.</p><p>Because of this, I now try to behave less like an architect&#8212;and more like an entrepreneur.</p><p>That means:</p><ul><li><p>ship first</p></li><li><p>get feedback</p></li><li><p>tweak later</p></li></ul><p>This is why the MVP mindset matters so much in data engineering.</p><p>MVP doesn&#8217;t mean trash output.</p><p>It means doing one very specific thing&#8212;and doing it really well.</p><p>When I start a project today, I avoid immediately building a generic solution.</p><p>Instead, I ask myself:</p><p>What is the question we need to answer first?</p><p>Then I plan backward.</p><p>Example:</p><ul><li><p><em>Can DuckDB support the load?</em></p><p>Instead of building the full pipeline upfront, I generate data and quickly run a stress test.</p></li><li><p><em>Can dlt support this source?</em></p><p>I build this in isolation first, validate the assumptions, and only then move on.</p></li></ul><p>The goal is to gather information early and push one-way decisions as late as possible.</p><h2>Boring Design Philosophy</h2><p>A boring system is:</p><ul><li><p>as little code as possible </p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:153758175,&quot;url&quot;:&quot;https://fromanengineersight.substack.com/p/issue-43-the-best-code-you-never&quot;,&quot;publication_id&quot;:256742,&quot;publication_name&quot;:&quot;From An Engineer Sight&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!5ENi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1fb566-11bb-440e-8967-9104b1b75049_256x256.png&quot;,&quot;title&quot;:&quot;Issue 43 - The Best Code You Never Wrote&quot;,&quot;truncated_body_text&quot;:&quot;Code is technical debt. The optimal spot for engineers is to write the least code possible but still write code.&quot;,&quot;date&quot;:&quot;2025-01-05T16:42:37.721Z&quot;,&quot;like_count&quot;:6,&quot;comment_count&quot;:6,&quot;bylines&quot;:[{&quot;id&quot;:23621089,&quot;name&quot;:&quot;Benoit Pimpaud&quot;,&quot;handle&quot;:&quot;fromanengineersight&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Yf1W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1700bc2d-b494-49e4-b282-f061f189382a_2883x2883.jpeg&quot;,&quot;bio&quot;:&quot;Writing From An Engineer Sight, a periodic about data, engineering and design.\nhttps://fromanengineersight.substack.com/&quot;,&quot;profile_set_up_at&quot;:&quot;2021-11-29T14:56:52.665Z&quot;,&quot;reader_installed_at&quot;:&quot;2022-03-09T15:42:34.088Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:209876,&quot;user_id&quot;:23621089,&quot;publication_id&quot;:256742,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:true,&quot;publication&quot;:{&quot;id&quot;:256742,&quot;name&quot;:&quot;From An Engineer Sight&quot;,&quot;subdomain&quot;:&quot;fromanengineersight&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;A periodic about data, engineering and design&quot;,&quot;logo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/aa1fb566-11bb-440e-8967-9104b1b75049_256x256.png&quot;,&quot;author_id&quot;:23621089,&quot;primary_user_id&quot;:23621089,&quot;theme_var_background_pop&quot;:&quot;#1f6bf0&quot;,&quot;created_at&quot;:&quot;2021-01-07T18:39:40.423Z&quot;,&quot;email_from_name&quot;:&quot;From an Engineer Sight&quot;,&quot;copyright&quot;:&quot;Benoit Pimpaud&quot;,&quot;founding_plan_name&quot;:&quot;Founding Member&quot;,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;enabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false}},{&quot;id&quot;:2897349,&quot;user_id&quot;:23621089,&quot;publication_id&quot;:2851066,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:2851066,&quot;name&quot;:&quot;Liminal Duality&quot;,&quot;subdomain&quot;:&quot;liminalduality&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Beauty is in the doorway&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1975ce36-fe37-4665-ac87-0c5c5e0d3d3c_520x520.png&quot;,&quot;author_id&quot;:23621089,&quot;primary_user_id&quot;:null,&quot;theme_var_background_pop&quot;:&quot;#FF9900&quot;,&quot;created_at&quot;:&quot;2024-08-04T09:01:11.981Z&quot;,&quot;email_from_name&quot;:&quot;Liminal Duality&quot;,&quot;copyright&quot;:&quot;Benoit Pimpaud&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;magaziney&quot;,&quot;is_personal_mode&quot;:false}}],&quot;twitter_screen_name&quot;:&quot;Ben8t&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;status&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:null,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:null,&quot;paidPublicationIds&quot;:[],&quot;subscriber&quot;:null}}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;,&quot;source&quot;:null}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://fromanengineersight.substack.com/p/issue-43-the-best-code-you-never?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!5ENi!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1fb566-11bb-440e-8967-9104b1b75049_256x256.png" loading="lazy"><span class="embedded-post-publication-name">From An Engineer Sight</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Issue 43 - The Best Code You Never Wrote</div></div><div class="embedded-post-body">Code is technical debt. The optimal spot for engineers is to write the least code possible but still write code&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">a year ago &#183; 6 likes &#183; 6 comments &#183; Benoit Pimpaud</div></a></div></li><li><p>optimized for easy maintenance, not fancy features</p></li><li><p>understandable by the largest number of engineers possible</p></li><li><p>designed without assuming massive growth</p></li></ul><h3>Is AI boring? </h3><p>Boring Engineering isn&#8217;t anti-AI&#8212;it&#8217;s about using AI boringly: as a productivity multiplier, not a revolution.</p><p>These 2025 projects allowed me to deeply engage with the AI coding wave.</p><p>Like many of you, my social feeds has been full of &#8220;game-changing&#8221; claims.</p><p>I don&#8217;t know whether AGI arrives tomorrow.</p><p>Engineers won&#8217;t be replaced.</p><p>What <em>is</em> happening, though, is more interesting.</p><p>There&#8217;s a boring side to this wave&#8212;and that&#8217;s where the real leverage is.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kQm9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kQm9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png 424w, https://substackcdn.com/image/fetch/$s_!kQm9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png 848w, https://substackcdn.com/image/fetch/$s_!kQm9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png 1272w, https://substackcdn.com/image/fetch/$s_!kQm9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kQm9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png" width="539" height="483.3181818181818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:868,&quot;width&quot;:968,&quot;resizeWidth&quot;:539,&quot;bytes&quot;:85061,&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://juhache.substack.com/i/183649097?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.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_!kQm9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png 424w, https://substackcdn.com/image/fetch/$s_!kQm9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png 848w, https://substackcdn.com/image/fetch/$s_!kQm9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.png 1272w, https://substackcdn.com/image/fetch/$s_!kQm9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcf62dd-ff60-402d-9461-657e3eee3fde_968x868.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>For me, coding agents like Claude Code have completely changed how I work this year.</p><p>Over the last two years, I gradually moved from:</p><ul><li><p>writing 100% of the code myself</p></li><li><p>to inline completions</p></li><li><p>to full prompting</p></li></ul><p>Today, I spend most of my time coordinating agents and reviewing changes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IX1W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IX1W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png 424w, https://substackcdn.com/image/fetch/$s_!IX1W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png 848w, https://substackcdn.com/image/fetch/$s_!IX1W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png 1272w, https://substackcdn.com/image/fetch/$s_!IX1W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IX1W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png" width="472" height="535.5957894736842" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f51d503-f022-4613-b18b-b1badb022613_950x1078.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1078,&quot;width&quot;:950,&quot;resizeWidth&quot;:472,&quot;bytes&quot;:317986,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/183649097?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!IX1W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png 424w, https://substackcdn.com/image/fetch/$s_!IX1W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png 848w, https://substackcdn.com/image/fetch/$s_!IX1W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.png 1272w, https://substackcdn.com/image/fetch/$s_!IX1W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51d503-f022-4613-b18b-b1badb022613_950x1078.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>In 2026, the boring way to engineer might be to leverage AI.</p><p>You keep the design.</p><p>You outsource the implementation&#8212;while staying accountable for the result.</p><h2>Outlook for This Year</h2><p>AI has changed how we build.</p><p>Everything feels new, and everyone is still figuring out how to use these tools effectively.</p><p>This year, I want to get back to publishing weekly, as I (almost) managed to do in my first two years.</p><p>This newsletter will embrace the Boring philosophy, with a clear focus on engineering in an AI-first world:</p><ul><li><p>Stress-testing data tools: understanding where tools work, where they break, and which ones are best suited to which problems</p></li><li><p>Leveraging AI coding assistants: practical workflows, patterns, and limits</p></li></ul><p>I want this newsletter to be:</p><ul><li><p>opinionated, but grounded in practice</p></li><li><p>focused on real-world trade-offs, not ideology</p></li><li><p>useful for engineers making decisions under constraints</p></li></ul><div class="poll-embed" data-attrs="{&quot;id&quot;:430583}" data-component-name="PollToDOM"></div><p>Thanks for reading,</p><p>Ju</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Building a (boring) chat-BI Agent]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 91]]></description><link>https://juhache.substack.com/p/building-a-boring-chat-bi-agent</link><guid isPermaLink="false">https://juhache.substack.com/p/building-a-boring-chat-bi-agent</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Fri, 12 Dec 2025 09:30:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0c02e66d-53ab-4f79-9bb3-6c0a8933d1db_2006x1494.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I&#8217;m Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p>In this post, I wanted to share my experience building a chat-BI agent using <a href="https://github.com/boringdata/boring-semantic-layer">BSL</a>.</p><p>BSL is an open source Semantic Layer we built with <a href="https://open.substack.com/users/14512158-hussain-sultan?utm_source=mentions">Hussain Sultan</a> (<a href="https://www.xorq.dev/">xorq</a>). </p><p>It aims to be extremely lightweight &#8212; pip-installable and compatible with any analytics DB through <a href="https://ibis-project.org/">Ibis</a>.</p><p>Because BSL is designed to be minimal and flexible, we thought it would be pretty cool to expose it through a chat interface directly in the terminal.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;d9c610d8-70a0-4e20-ba1d-143d89a61c41&quot;,&quot;duration&quot;:null}"></div><p>Want to try it?</p><p>Choose your poison:</p><pre><code><code>export OPENAI_API_KEY=sk-...
export ANTHROPIC_API_KEY=sk-ant-...
export GOOGLE_API_KEY=...</code></code></pre><p>and for OpenAI run:</p><pre><code>uvx --from "boring-semantic-layer[agent]" \
    --with langchain-openai,langchain-anthropic,duckdb \
    bsl chat --sm https://raw.githubusercontent.com/boringdata/boring-semantic-layer/main/examples/flights.yml \
    --llm openai:gpt-5.2 </code></pre><p>or Anthropic: </p><pre><code><code>uvx --from "boring-semantic-layer[agent]" \
    --with langchain-openai,langchain-anthropic,duckdb \
    bsl chat --sm https://raw.githubusercontent.com/boringdata/boring-semantic-layer/main/examples/flights.yml \
    --llm anthropic:claude-opus-4-5-20251101</code></code></pre><p>This post is the first in a series where I&#8217;ll share everything I&#8217;ve learned over the past few weeks while building this kind of agent.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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">If you want to be notified about the upcoming posts &#8594; subscribe here &#11015;&#65039;</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>There are three main ways to wire an LLM to your database:</p><ol><li><p>Direct SQL Generation</p><p>User &#8594; LLM &#8594; SQL &#8594; DB</p></li><li><p>via MCP</p><p>User &#8594; LLM &#8594; MCP + Semantic Layer &#8594; DB</p></li><li><p>via Tools</p><p>User &#8594; LLM &#8594; LLM Tool + Semantic Layer &#8594; DB</p></li></ol><p>Let&#8217;s dive in !</p><h1>Option 1: Direct SQL Generation</h1><p>This is the simplest approach: LLMs keep getting better at writing SQL, so you can pass them a well-crafted system prompt and let them translate user requests directly into SQL.</p><p>This works reasonably well for small and simple data models, where the number of tables and relationships is limited.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WjFy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WjFy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png 424w, https://substackcdn.com/image/fetch/$s_!WjFy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png 848w, https://substackcdn.com/image/fetch/$s_!WjFy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png 1272w, https://substackcdn.com/image/fetch/$s_!WjFy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WjFy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png" width="498" height="453.2694610778443" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:912,&quot;width&quot;:1002,&quot;resizeWidth&quot;:498,&quot;bytes&quot;:275668,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!WjFy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png 424w, https://substackcdn.com/image/fetch/$s_!WjFy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png 848w, https://substackcdn.com/image/fetch/$s_!WjFy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.png 1272w, https://substackcdn.com/image/fetch/$s_!WjFy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff402db33-3a35-41b6-8696-12decdb0d91f_1002x912.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>However, as your data universe grows, more and more context ends up living only in your analysts&#8217; heads.</p><p>The LLM doesn&#8217;t have access to that implicit knowledge &#8212; so it naturally makes more mistakes.</p><p>For example, a user_id in table A may not represent the same entity as a user_id in table B, even though the column names look similar. </p><p>Without that context, the LLM confidently produces incorrect joins or misleading queries.</p><p>The more information remains <em>implicit</em> or <em>hidden</em>, the more frequently the LLM will get things wrong.</p><p>A way to reduce hallucinations is to limit the LLM&#8217;s degrees of freedom by introducing a semantic layer.</p><p>This layer defines pre-approved metrics, joins, and aggregation patterns, which the LLM can safely use.</p><p>Instead of translating natural language into complex SQL, the LLM only needs to map user intent to a small set of measures and dimensions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BhpR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BhpR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png 424w, https://substackcdn.com/image/fetch/$s_!BhpR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png 848w, https://substackcdn.com/image/fetch/$s_!BhpR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png 1272w, https://substackcdn.com/image/fetch/$s_!BhpR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BhpR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png" width="478" height="596.0941176470589" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1272,&quot;width&quot;:1020,&quot;resizeWidth&quot;:478,&quot;bytes&quot;:87239,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.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_!BhpR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png 424w, https://substackcdn.com/image/fetch/$s_!BhpR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png 848w, https://substackcdn.com/image/fetch/$s_!BhpR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.png 1272w, https://substackcdn.com/image/fetch/$s_!BhpR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2db674d-8c34-402d-bdd0-06c791655f36_1020x1272.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><br>This doesn&#8217;t eliminate hallucinations entirely, but it drastically reduces syntax errors and invalid queries.</p><p>So the next question becomes: how do we give an LLM access to a semantic layer?</p><p>There are two main ways to add this capability:</p><ul><li><p>MCP interface</p></li><li><p>LLM Tools</p></li></ul><h1>Option 2: User &#8594; LLM &#8594; MCP </h1><p>MCP has been everywhere in recent months.</p><p>The idea is straightforward: expose external tools to an LLM through the new MCP protocol.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MeLG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MeLG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png 424w, https://substackcdn.com/image/fetch/$s_!MeLG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png 848w, https://substackcdn.com/image/fetch/$s_!MeLG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png 1272w, https://substackcdn.com/image/fetch/$s_!MeLG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MeLG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png" width="1440" height="524" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:524,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:190163,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.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_!MeLG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png 424w, https://substackcdn.com/image/fetch/$s_!MeLG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png 848w, https://substackcdn.com/image/fetch/$s_!MeLG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png 1272w, https://substackcdn.com/image/fetch/$s_!MeLG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cad4c23-a91a-4d7c-a73d-4d1a5ff61dfc_1440x524.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://modelcontextprotocol.io/docs/getting-started/intro">source</a></figcaption></figure></div><p>It&#8217;s a great way to give an LLM access to remote capabilities&#8212;emails, Slack, databases&#8212;and it&#8217;s already widely supported across major LLM providers.</p><p>BSL supports this via a dedicated class:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9DZD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9DZD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png 424w, https://substackcdn.com/image/fetch/$s_!9DZD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png 848w, https://substackcdn.com/image/fetch/$s_!9DZD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!9DZD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9DZD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png" width="612" height="290.0274725274725" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:690,&quot;width&quot;:1456,&quot;resizeWidth&quot;:612,&quot;bytes&quot;:228643,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.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_!9DZD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png 424w, https://substackcdn.com/image/fetch/$s_!9DZD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png 848w, https://substackcdn.com/image/fetch/$s_!9DZD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!9DZD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba1f5fc-cde3-4b7e-854c-7bca3233d3f8_2640x1252.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This works very well&#8230; but it requires you to host an MCP server.</p><p>And that feels unnecessarily heavy (and definitely <em>not</em> boring) when all you need is a simple bridge between an LLM and your database.</p><h1>Option 3: User &#8594; LLM &#8594; Tool </h1><p>LLM tools are another way to give models additional capabilities. </p><p>You provide the model with a description of each tool: its purpose, parameters, and usage guidelines.</p><p>The LLM then takes the user prompt and returns a list of tools to execute, along with the associated parameters.</p><p>Contrary to the MCP approach, tool execution happens directly in the environment that is calling the LLM, not through a remote server.</p><p>Local coding agents use this pattern extensively. </p><p>Claude Code, for example, is essentially an LLM combined with a set of tools for searching, reading, and editing files.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tvJc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tvJc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png 424w, https://substackcdn.com/image/fetch/$s_!tvJc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png 848w, https://substackcdn.com/image/fetch/$s_!tvJc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png 1272w, https://substackcdn.com/image/fetch/$s_!tvJc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tvJc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png" width="430" height="548.4554140127389" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1602,&quot;width&quot;:1256,&quot;resizeWidth&quot;:430,&quot;bytes&quot;:314504,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.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_!tvJc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png 424w, https://substackcdn.com/image/fetch/$s_!tvJc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png 848w, https://substackcdn.com/image/fetch/$s_!tvJc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png 1272w, https://substackcdn.com/image/fetch/$s_!tvJc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae706d7c-1a30-40b3-bd01-89ab6424d756_1256x1602.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://code.claude.com/docs/en/settings">source</a></figcaption></figure></div><p>Ideally, we would also like to outsource tool execution to the LLM provider. </p><p>And indeed, providers are starting to offer sandbox capabilities through their &#8220;Code Interpreter&#8221; features.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Co3Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Co3Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png 424w, https://substackcdn.com/image/fetch/$s_!Co3Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png 848w, https://substackcdn.com/image/fetch/$s_!Co3Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png 1272w, https://substackcdn.com/image/fetch/$s_!Co3Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Co3Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png" width="546" height="129.375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:345,&quot;width&quot;:1456,&quot;resizeWidth&quot;:546,&quot;bytes&quot;:67962,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.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_!Co3Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png 424w, https://substackcdn.com/image/fetch/$s_!Co3Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png 848w, https://substackcdn.com/image/fetch/$s_!Co3Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png 1272w, https://substackcdn.com/image/fetch/$s_!Co3Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08034a04-9e90-4738-9313-09d4b44fb6ef_1560x370.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Open AI code interpreter</figcaption></figure></div><p>This would be the ideal workflow, but unfortunately you can&#8217;t install your own libraries inside these sandboxes, which means you can&#8217;t access BSL from within them.</p><p>So for now, the only viable approach is to handle tool execution ourselves.</p><p>The workflow is then the following:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bezd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bezd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png 424w, https://substackcdn.com/image/fetch/$s_!bezd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png 848w, https://substackcdn.com/image/fetch/$s_!bezd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png 1272w, https://substackcdn.com/image/fetch/$s_!bezd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bezd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png" width="1422" height="964" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:964,&quot;width&quot;:1422,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133656,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.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_!bezd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png 424w, https://substackcdn.com/image/fetch/$s_!bezd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png 848w, https://substackcdn.com/image/fetch/$s_!bezd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.png 1272w, https://substackcdn.com/image/fetch/$s_!bezd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a5ba27c-f3bf-4c42-ab35-836962c9e2d3_1422x964.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><ul><li><p><strong>Step 1:</strong> Receive a request from the user.</p></li><li><p><strong>Step 2:</strong> Send it to the LLM along with:</p><ul><li><p>the list of tools it can call</p></li><li><p>the semantic models definitions</p></li></ul></li><li><p><strong>Step 3:</strong> Execute the tool selected by the LLM.</p></li><li><p><strong>Step 4:</strong> If the LLM chooses to run a query, pass that query to BSL.</p></li><li><p><strong>Step 5:</strong> BSL executes the query, retrieve the result, and return it to the user.</p></li></ul><p>In the case of BSL, we expose four tools:</p><ul><li><p><strong>list_models</strong> &#8212; lists the available models</p></li><li><p><strong>get_model</strong> &#8212; returns the measures and dimensions available for a given model</p></li><li><p>query_model &#8212; executes a BSL query and returns or charts the results</p></li><li><p><strong>get_documentation</strong> &#8212; provides a set of prompts the LLM can use for more advanced patterns</p></li></ul><p>These tools are just JSON definitions following the OpenAI tool format: they describe how a tool should be called and which parameters it accepts.</p><p>We wrap them in a dedicated <code>BSLTool</code> class that handles execution for you.</p><p>You simply provide your semantic model in YAML&#8212;and that&#8217;s it.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QGTc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QGTc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png 424w, https://substackcdn.com/image/fetch/$s_!QGTc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png 848w, https://substackcdn.com/image/fetch/$s_!QGTc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png 1272w, https://substackcdn.com/image/fetch/$s_!QGTc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QGTc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png" width="616" height="229.73076923076923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:543,&quot;width&quot;:1456,&quot;resizeWidth&quot;:616,&quot;bytes&quot;:152209,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.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_!QGTc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png 424w, https://substackcdn.com/image/fetch/$s_!QGTc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png 848w, https://substackcdn.com/image/fetch/$s_!QGTc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png 1272w, https://substackcdn.com/image/fetch/$s_!QGTc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07d6081a-7ac0-40fb-940d-5400df7688bd_2392x892.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Any LLM can then immediately use these tools to query your database.</p><p>You can use it with OpenAI:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yzw4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yzw4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png 424w, https://substackcdn.com/image/fetch/$s_!yzw4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png 848w, https://substackcdn.com/image/fetch/$s_!yzw4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png 1272w, https://substackcdn.com/image/fetch/$s_!yzw4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yzw4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png" width="656" height="382.0659340659341" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:848,&quot;width&quot;:1456,&quot;resizeWidth&quot;:656,&quot;bytes&quot;:397721,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.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_!yzw4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png 424w, https://substackcdn.com/image/fetch/$s_!yzw4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png 848w, https://substackcdn.com/image/fetch/$s_!yzw4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.png 1272w, https://substackcdn.com/image/fetch/$s_!yzw4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bb1953c-6aac-47ca-b2d4-87817f8df5cf_3076x1792.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>Or Anthropic:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hwei!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hwei!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.png 424w, https://substackcdn.com/image/fetch/$s_!hwei!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.png 848w, https://substackcdn.com/image/fetch/$s_!hwei!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.png 1272w, https://substackcdn.com/image/fetch/$s_!hwei!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hwei!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.png" width="652" height="394.96153846153845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f282d090-18e7-4f19-a656-553400944414_3552x2152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:882,&quot;width&quot;:1456,&quot;resizeWidth&quot;:652,&quot;bytes&quot;:506361,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.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_!hwei!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.png 424w, https://substackcdn.com/image/fetch/$s_!hwei!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.png 848w, https://substackcdn.com/image/fetch/$s_!hwei!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.png 1272w, https://substackcdn.com/image/fetch/$s_!hwei!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff282d090-18e7-4f19-a656-553400944414_3552x2152.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>No hosting, no MCP.</p><p>Just: pip install + 1 YAML file</p><p>&#8230; So boring &#8230;</p><h1>From LLM Tool to Chat</h1><p>Now we can have our favorite LLMs calling BSL queries and accessing your data.</p><p>To build a full charting experience on top of this, we also need to manage conversation context, multiple tool calls, and chat history.</p><p>Rather than reinventing all of that infrastructure, we rely on existing frameworks that already handle:</p><ul><li><p>LLM provider integration</p></li><li><p>Conversation history</p></li><li><p>Chat context management</p></li></ul><p>For now, we started with LangChain/LangGraph.</p><p>We&#8217;ve implemented a first version of this in the <code>LangGraphBackend</code> class, which is the class used behind the chat CLI command.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8tCY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8tCY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png 424w, https://substackcdn.com/image/fetch/$s_!8tCY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png 848w, https://substackcdn.com/image/fetch/$s_!8tCY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png 1272w, https://substackcdn.com/image/fetch/$s_!8tCY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8tCY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png" width="1456" height="491" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:491,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:261123,&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://juhache.substack.com/i/179331353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.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_!8tCY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png 424w, https://substackcdn.com/image/fetch/$s_!8tCY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png 848w, https://substackcdn.com/image/fetch/$s_!8tCY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.png 1272w, https://substackcdn.com/image/fetch/$s_!8tCY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4b8f5ca-6b16-40cd-a59f-4adf60a7c761_3440x1160.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 goal is to extend support to other frameworks as well as the ecosystem evolves.</p><p>There&#8217;s a lot more to say about this&#8212;especially around context management, prompt structure, and how to keep the context small to avoid exploding LLM costs.</p><p>We&#8217;re still experimenting a lot on these topics and will share our findings in a follow-up post.</p><h1>Next steps</h1><p>This agent feature is still quite new, and we&#8217;re looking forward to gathering feedback from users to refine the prompts and handle edge cases.</p><p>If you find any bug, don&#8217;t hesistate to open an issue <a href="https://github.com/boringdata/boring-semantic-layer">here</a>.</p><p>In the coming posts, I want to share more about context management, eval strategies, and everything I learn along the way while building this.</p><p>On the feature side, I&#8217;d love to add the following to this v0:</p><ul><li><p>support for local LLMs</p></li><li><p>out-of-the-box Slack integration</p></li><li><p>code sandbox support (with only DB and LLM connections allowed)</p></li><li><p>markdown based analytics report (similar to <a href="https://evidence.dev/">evidence.dev</a> but with BSL queries)</p><p></p></li></ul><p>For the markdown reports, the idea is simple:</p><ol><li><p>write a Markdown document with BSL query blocks,</p></li><li><p>run it through the BSL CLI,</p></li><li><p>get a fully rendered HTML report with charts and data tables.</p></li></ol><p>This would allow you to persist the BSL queries generated during a chat session into shareable artifacts.</p><div><hr></div><p>We are super excited by this new step of BSL.</p><p>We&#8217;re convinced that BSL is quickly becoming the lightest and most flexible semantic layer solution on the market.</p><p>A big thanks to all contributors who helped improve BSL.</p><p>If you share our enthusiasm:</p><ul><li><p>Explore the <a href="https://github.com/boringdata/boring-semantic-layer">repo</a></p></li><li><p>Give it a <a href="https://github.com/boringdata/boring-semantic-layer">&#11088;</a></p></li><li><p>And show us what you build with it!</p></li></ul><p>Thanks for reading,</p><p>Ju</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Boring Semantic Layer v2]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 90]]></description><link>https://juhache.substack.com/p/boring-semantic-layer-v2</link><guid isPermaLink="false">https://juhache.substack.com/p/boring-semantic-layer-v2</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Wed, 05 Nov 2025 09:58:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ba4a9e3f-c0d2-480e-b74d-840eb680a106_1144x740.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I'm Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p></p><p>Three months ago, we launched with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Hussain Sultan&quot;,&quot;id&quot;:14512158,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F27728441-eee7-495b-a101-d8ca4f895503_512x512.jpeg&quot;,&quot;uuid&quot;:&quot;bb8516df-d372-4182-bc5a-c4f70c1fab5d&quot;}" data-component-name="MentionToDOM"></span> (<a href="https://www.xorq.dev/">xorq</a>) the <strong><a href="https://github.com/boringdata/boring-semantic-layer">Boring Semantic Layer (BSL)</a></strong>. </p><p>Since then, we&#8217;ve been lucky to gather tons of feedback from early adopters.</p><p>We&#8217;re excited to announce the launch of <strong>BSL v2</strong>!</p><p>This new version unlocks a set of powerful possibilities, and in this post, we&#8217;ll walk you through:</p><ol><li><p>What v1 looked like</p></li><li><p>What we learned from its limitations</p></li><li><p>How v2 changes the game</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_!5oQ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5oQ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png 424w, https://substackcdn.com/image/fetch/$s_!5oQ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png 848w, https://substackcdn.com/image/fetch/$s_!5oQ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png 1272w, https://substackcdn.com/image/fetch/$s_!5oQ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5oQ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png" width="1456" height="613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:613,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:500793,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.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_!5oQ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png 424w, https://substackcdn.com/image/fetch/$s_!5oQ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png 848w, https://substackcdn.com/image/fetch/$s_!5oQ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png 1272w, https://substackcdn.com/image/fetch/$s_!5oQ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce260b1c-eabf-4c9e-a7ff-93d1d08eab5c_2132x898.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://boringdata.github.io/boring-semantic-layer/">Link</a> to our new doc</figcaption></figure></div><h2>1 - <strong>BSL v1</strong></h2><p>The first version of BSL kept things extremely straightforward:</p><p>One SemanticModel that takes as input:</p><ul><li><p>1 Ibis table</p></li><li><p>measures, dimensions, and join definitions (defined as lambda functions)</p></li></ul><p>Example:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I2h9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I2h9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png 424w, https://substackcdn.com/image/fetch/$s_!I2h9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png 848w, https://substackcdn.com/image/fetch/$s_!I2h9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png 1272w, https://substackcdn.com/image/fetch/$s_!I2h9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I2h9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png" width="532" height="214.84615384615384" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8fa50094-7187-43bd-9261-9d068a933232_2208x892.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:1456,&quot;resizeWidth&quot;:532,&quot;bytes&quot;:173652,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.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_!I2h9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png 424w, https://substackcdn.com/image/fetch/$s_!I2h9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png 848w, https://substackcdn.com/image/fetch/$s_!I2h9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png 1272w, https://substackcdn.com/image/fetch/$s_!I2h9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa50094-7187-43bd-9261-9d068a933232_2208x892.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Querying was just as simple as selecting dimensions and measures:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pL3S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pL3S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png 424w, https://substackcdn.com/image/fetch/$s_!pL3S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png 848w, https://substackcdn.com/image/fetch/$s_!pL3S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png 1272w, https://substackcdn.com/image/fetch/$s_!pL3S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pL3S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png" width="558" height="166.32692307692307" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:434,&quot;width&quot;:1456,&quot;resizeWidth&quot;:558,&quot;bytes&quot;:101237,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.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_!pL3S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png 424w, https://substackcdn.com/image/fetch/$s_!pL3S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png 848w, https://substackcdn.com/image/fetch/$s_!pL3S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png 1272w, https://substackcdn.com/image/fetch/$s_!pL3S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd83387f-fd6b-4347-aa3c-6d0deb2211d5_2080x620.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>In that case, the output = a DataFrame with flight counts per origin.</p><p>We then extended around this concept with:</p><ul><li><p><strong>YAML support</strong> &#8594; define semantics in declarative files</p></li><li><p><strong>Chart </strong>&#8594; query results as charts, not just DataFrames</p></li><li><p><strong>MCP integration</strong> &#8594; expose the <code>query()</code> method directly to LLMs</p></li></ul><h2>2- Limitations</h2><p>As clean as v1 was, we hit a few walls quickly:</p><h4>Complex aggregation</h4><p>Things like <em>percent of total</em>, <em>rankings</em>, or <em>rolling windows</em> often require two steps:</p><ol><li><p>Aggregate</p></li><li><p>Post-process</p></li></ol><p>Our simple <code>query()</code>interface wasn&#8217;t expressive enough for these.</p><p>We considered adding a post_agg attribute, but that approach didn&#8217;t feel elegant or scalable.</p><h4>Filters</h4><p>In v1, filters were limited to dimensions:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q9Ut!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q9Ut!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png 424w, https://substackcdn.com/image/fetch/$s_!q9Ut!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png 848w, https://substackcdn.com/image/fetch/$s_!q9Ut!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png 1272w, https://substackcdn.com/image/fetch/$s_!q9Ut!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q9Ut!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png" width="526" height="225.42857142857142" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:624,&quot;width&quot;:1456,&quot;resizeWidth&quot;:526,&quot;bytes&quot;:125821,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.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_!q9Ut!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png 424w, https://substackcdn.com/image/fetch/$s_!q9Ut!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png 848w, https://substackcdn.com/image/fetch/$s_!q9Ut!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png 1272w, https://substackcdn.com/image/fetch/$s_!q9Ut!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97f7797c-42b7-4f56-b2f6-c71ecd7d7fdd_2080x892.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>But users wanted more flexibility:</p><ul><li><p>Filters <em>before and after</em> aggregation</p></li><li><p>Filters on dimensions, measures, or even raw table columns</p></li></ul><h4>Composability</h4><p>In v1, the SemanticModel was the end of the road: once defined, you could only query it.</p><p>But in practice, teams want to <em>compose</em> models:</p><ul><li><p>Marketing defines a Users semantic model</p></li><li><p>Support defines a SupportCases semantic model</p></li><li><p>Together, they want a metric: <strong>support cases per customer category</strong></p></li></ul><p>With v1, this meant rebuilding from raw tables again.</p><p>Not ideal.</p><h2><strong>Enter BSL v2</strong></h2><p>For BSL v2, we have decided to change its core and bring it to the next stage.</p><p>We&#8217;ve almost completely rewritten it, introducing a much deeper integration with Ibis.</p><p>To understand what changed in v2, it helps to take a step back and look at how Ibis itself works.</p><h2>How Ibis works</h2><p>At its core, Ibis doesn&#8217;t execute queries directly. </p><p>Instead, it builds an expression graph:</p><ul><li><p>Every table, column, dimension, or measure you define is a <strong>node</strong> in the graph.</p></li><li><p>Each operation (like group_by, count, or filter) creates a new edge.</p></li></ul><p>Let&#8217;s take the following ibis query:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZOGW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZOGW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png 424w, https://substackcdn.com/image/fetch/$s_!ZOGW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png 848w, https://substackcdn.com/image/fetch/$s_!ZOGW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png 1272w, https://substackcdn.com/image/fetch/$s_!ZOGW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZOGW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png" width="546" height="237.375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:633,&quot;width&quot;:1456,&quot;resizeWidth&quot;:546,&quot;bytes&quot;:162724,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.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_!ZOGW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png 424w, https://substackcdn.com/image/fetch/$s_!ZOGW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png 848w, https://substackcdn.com/image/fetch/$s_!ZOGW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png 1272w, https://substackcdn.com/image/fetch/$s_!ZOGW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69c5eedc-9b5e-4f14-9d47-01a54d642b91_2464x1072.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>When the user defines agg_expr, no SQL is executed yet &#8212; Ibis creates the following expression graph:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e3pJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e3pJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png 424w, https://substackcdn.com/image/fetch/$s_!e3pJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png 848w, https://substackcdn.com/image/fetch/$s_!e3pJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!e3pJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e3pJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png" width="376" height="426.6666666666667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:1128,&quot;resizeWidth&quot;:376,&quot;bytes&quot;:189545,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.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_!e3pJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png 424w, https://substackcdn.com/image/fetch/$s_!e3pJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png 848w, https://substackcdn.com/image/fetch/$s_!e3pJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!e3pJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc595afd2-f1a6-4679-bfeb-5d4806d94100_1128x1280.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>Only when you call .<code>compile()</code> or <code>.execute()</code> does Ibis translate the graph into the native SQL of your backend (DuckDB, BigQuery, Postgres, Snowflake, &#8230;):</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N1Sn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N1Sn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png 424w, https://substackcdn.com/image/fetch/$s_!N1Sn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png 848w, https://substackcdn.com/image/fetch/$s_!N1Sn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png 1272w, https://substackcdn.com/image/fetch/$s_!N1Sn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N1Sn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png" width="548" height="92.58791208791209" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:246,&quot;width&quot;:1456,&quot;resizeWidth&quot;:548,&quot;bytes&quot;:46465,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.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_!N1Sn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png 424w, https://substackcdn.com/image/fetch/$s_!N1Sn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png 848w, https://substackcdn.com/image/fetch/$s_!N1Sn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png 1272w, https://substackcdn.com/image/fetch/$s_!N1Sn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707d88c4-3639-4081-8a2d-e9e49ce07321_2080x352.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vLRA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vLRA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png 424w, https://substackcdn.com/image/fetch/$s_!vLRA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png 848w, https://substackcdn.com/image/fetch/$s_!vLRA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png 1272w, https://substackcdn.com/image/fetch/$s_!vLRA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vLRA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png" width="206" height="326.3109243697479" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:754,&quot;width&quot;:476,&quot;resizeWidth&quot;:206,&quot;bytes&quot;:61982,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.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_!vLRA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png 424w, https://substackcdn.com/image/fetch/$s_!vLRA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png 848w, https://substackcdn.com/image/fetch/$s_!vLRA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.png 1272w, https://substackcdn.com/image/fetch/$s_!vLRA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2608a7b-8df6-4e5e-8f4b-248cec2afe3e_476x754.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>In BSL v1, the semantic layer was essentially  a query endpoint that sat on top of the Ibis graph without integrating into it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y8P6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y8P6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png 424w, https://substackcdn.com/image/fetch/$s_!Y8P6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png 848w, https://substackcdn.com/image/fetch/$s_!Y8P6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!Y8P6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y8P6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png" width="318" height="449.0974930362117" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1014,&quot;width&quot;:718,&quot;resizeWidth&quot;:318,&quot;bytes&quot;:55418,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.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_!Y8P6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png 424w, https://substackcdn.com/image/fetch/$s_!Y8P6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png 848w, https://substackcdn.com/image/fetch/$s_!Y8P6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!Y8P6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889d4787-3625-4548-bb5a-b11c4cdcca68_718x1014.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This means that dimensions and measures were not part of the expression graph itself, which limited composability and the ability to perform more complex transformations.</p><h2>BSL is now part of the Ibis graph</h2><p>With BSL v2, semantic models are now first-class nodes within the Ibis expression graph.</p><p>A semantic model is no longer just a query endpoint &#8212; it is a dedicated node in the graph that carries both dimension and measure metadata.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ciFj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ciFj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png 424w, https://substackcdn.com/image/fetch/$s_!ciFj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png 848w, https://substackcdn.com/image/fetch/$s_!ciFj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png 1272w, https://substackcdn.com/image/fetch/$s_!ciFj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ciFj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png" width="236" height="325.9922178988327" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:710,&quot;width&quot;:514,&quot;resizeWidth&quot;:236,&quot;bytes&quot;:38279,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.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_!ciFj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png 424w, https://substackcdn.com/image/fetch/$s_!ciFj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png 848w, https://substackcdn.com/image/fetch/$s_!ciFj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.png 1272w, https://substackcdn.com/image/fetch/$s_!ciFj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73ef6f67-17b7-4139-ac41-6d35f2afdb6e_514x710.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>Concretely, this means we have introduced a new kind of Ibis table: <strong>semantic tables</strong>.</p><p>These are regular Ibis tables to which you can attach semantic information, such as definitions for dimensions and measures:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xRWX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xRWX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png 424w, https://substackcdn.com/image/fetch/$s_!xRWX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png 848w, https://substackcdn.com/image/fetch/$s_!xRWX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!xRWX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xRWX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png" width="564" height="310.2774725274725" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:801,&quot;width&quot;:1456,&quot;resizeWidth&quot;:564,&quot;bytes&quot;:281964,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.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_!xRWX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png 424w, https://substackcdn.com/image/fetch/$s_!xRWX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png 848w, https://substackcdn.com/image/fetch/$s_!xRWX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!xRWX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b29f244-ef8a-4a06-bea4-19b7c48a354a_2604x1432.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This table behaves like a regular Ibis table, but it also provides access to semantic metadata.</p><ul><li><p>Want to select a <strong>dimension</strong>? &#8594; performs an ibis .group_by()</p></li><li><p>Want to select a <strong>measure</strong>? &#8594; performs an ibis .aggregate()</p></li></ul><p>Querying your semantic model now feels like a regular Ibis query, but with a semantic layer: </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9rdI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9rdI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png 424w, https://substackcdn.com/image/fetch/$s_!9rdI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png 848w, https://substackcdn.com/image/fetch/$s_!9rdI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png 1272w, https://substackcdn.com/image/fetch/$s_!9rdI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9rdI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png" width="524" height="156.19230769230768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cea74057-671f-488c-9f91-94dae8601f6d_2080x620.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:434,&quot;width&quot;:1456,&quot;resizeWidth&quot;:524,&quot;bytes&quot;:100127,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.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_!9rdI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png 424w, https://substackcdn.com/image/fetch/$s_!9rdI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png 848w, https://substackcdn.com/image/fetch/$s_!9rdI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png 1272w, https://substackcdn.com/image/fetch/$s_!9rdI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea74057-671f-488c-9f91-94dae8601f6d_2080x620.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This makes queries highly flexible; users can also apply ad-hoc transformations directly on the semantic table:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IcLt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IcLt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png 424w, https://substackcdn.com/image/fetch/$s_!IcLt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png 848w, https://substackcdn.com/image/fetch/$s_!IcLt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png 1272w, https://substackcdn.com/image/fetch/$s_!IcLt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IcLt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png" width="1456" height="389" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:389,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:194274,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.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_!IcLt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png 424w, https://substackcdn.com/image/fetch/$s_!IcLt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png 848w, https://substackcdn.com/image/fetch/$s_!IcLt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png 1272w, https://substackcdn.com/image/fetch/$s_!IcLt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511328a8-2a7a-4519-80b9-d643e808b1b6_3336x892.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Additionally, this enables the use Ibis&#8217;s <a href="https://ibis-project.org/reference/expression-tables.html#ibis.expr.types.relations.Table.mutate">mutate()</a> method, which allows post-aggregation and unlocks the following use cases:</p><p><strong>Percentage of total:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_0sj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_0sj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png 424w, https://substackcdn.com/image/fetch/$s_!_0sj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png 848w, https://substackcdn.com/image/fetch/$s_!_0sj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png 1272w, https://substackcdn.com/image/fetch/$s_!_0sj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_0sj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png" width="1456" height="349" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:349,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:169213,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.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_!_0sj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png 424w, https://substackcdn.com/image/fetch/$s_!_0sj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png 848w, https://substackcdn.com/image/fetch/$s_!_0sj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png 1272w, https://substackcdn.com/image/fetch/$s_!_0sj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcab80d8-57ce-450d-b315-ce0c6a702b6d_3336x800.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>Rolling averages</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_!AoCa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AoCa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png 424w, https://substackcdn.com/image/fetch/$s_!AoCa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png 848w, https://substackcdn.com/image/fetch/$s_!AoCa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png 1272w, https://substackcdn.com/image/fetch/$s_!AoCa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AoCa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png" width="1456" height="506" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:506,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:259265,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.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_!AoCa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png 424w, https://substackcdn.com/image/fetch/$s_!AoCa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png 848w, https://substackcdn.com/image/fetch/$s_!AoCa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.png 1272w, https://substackcdn.com/image/fetch/$s_!AoCa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440458fe-4d92-4812-88f5-e3118a77e626_3336x1160.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><h1>Composability</h1><p>With v2, semantic tables are first-class nodes in the Ibis graph. </p><p>This means you can treat the output of one semantic table as the input to another, just like any other Ibis expression.</p><p>For example, imagine:</p><ul><li><p>The marketing team defines a &#8220;User&#8221; semantic table.</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_!dzZi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dzZi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png 424w, https://substackcdn.com/image/fetch/$s_!dzZi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png 848w, https://substackcdn.com/image/fetch/$s_!dzZi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!dzZi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dzZi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png" width="708" height="303.91483516483515" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:625,&quot;width&quot;:1456,&quot;resizeWidth&quot;:708,&quot;bytes&quot;:331693,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.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_!dzZi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png 424w, https://substackcdn.com/image/fetch/$s_!dzZi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png 848w, https://substackcdn.com/image/fetch/$s_!dzZi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!dzZi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b65a7f8-eba5-42f4-bcaa-46f4dcaf5ac4_3336x1432.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><ul><li><p>The support team defines a &#8220;SupportCases&#8221; semantic table.</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_!bLNh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bLNh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png 424w, https://substackcdn.com/image/fetch/$s_!bLNh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png 848w, https://substackcdn.com/image/fetch/$s_!bLNh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!bLNh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bLNh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png" width="1456" height="625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:625,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:333350,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.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_!bLNh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png 424w, https://substackcdn.com/image/fetch/$s_!bLNh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png 848w, https://substackcdn.com/image/fetch/$s_!bLNh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!bLNh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef323116-7a1e-49a2-9ae2-33657507fc77_3336x1432.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>Together, they want a metric like support cases per customer segment, so they create a new semantic model built on top of these two existing models:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vzdx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vzdx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png 424w, https://substackcdn.com/image/fetch/$s_!vzdx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png 848w, https://substackcdn.com/image/fetch/$s_!vzdx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png 1272w, https://substackcdn.com/image/fetch/$s_!vzdx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vzdx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png" width="634" height="222.3573806881243" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:316,&quot;width&quot;:901,&quot;resizeWidth&quot;:634,&quot;bytes&quot;:98353,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a10ccc-a4a0-439e-893d-110fe5d71cac_914x318.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_!vzdx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png 424w, https://substackcdn.com/image/fetch/$s_!vzdx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png 848w, https://substackcdn.com/image/fetch/$s_!vzdx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png 1272w, https://substackcdn.com/image/fetch/$s_!vzdx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58257ae6-2c23-45de-a106-2077b013cbb4_901x316.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The user (or LLM) can then simply query the measure avg_case_value and aggregate it along any available dimension from any model.</p><p>All without worrying about where the underlying information comes from:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V4OP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V4OP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png 424w, https://substackcdn.com/image/fetch/$s_!V4OP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png 848w, https://substackcdn.com/image/fetch/$s_!V4OP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!V4OP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V4OP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png" width="1456" height="665" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:665,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:298028,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.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_!V4OP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png 424w, https://substackcdn.com/image/fetch/$s_!V4OP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png 848w, https://substackcdn.com/image/fetch/$s_!V4OP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!V4OP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd71e4ff4-415e-4cf6-8969-a57368205d52_3136x1432.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><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!33oR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!33oR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png 424w, https://substackcdn.com/image/fetch/$s_!33oR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png 848w, https://substackcdn.com/image/fetch/$s_!33oR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png 1272w, https://substackcdn.com/image/fetch/$s_!33oR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!33oR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png" width="1102" height="230" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:230,&quot;width&quot;:1102,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41095,&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://juhache.substack.com/i/173436037?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.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_!33oR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png 424w, https://substackcdn.com/image/fetch/$s_!33oR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png 848w, https://substackcdn.com/image/fetch/$s_!33oR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png 1272w, https://substackcdn.com/image/fetch/$s_!33oR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc72e15dc-1a48-45e5-858d-f30c865614fd_1102x230.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h1>BSL v1&#8594;v2 </h1><p>Of course, all BSL v1 features remain fully compatible with v2:</p><ul><li><p><strong>YAML-based semantic definitions</strong> &#8212; you can still define semantic tables declaratively.</p></li><li><p><strong>Charting</strong> &#8212; the .chart() method works as before, now directly on SemanticTable queries.</p></li><li><p><strong>MCP integration</strong> &#8212; expose your semantic tables to LLMs via MCP just like in v1.</p><p></p></li></ul><h1>Next Step</h1><p>One incredible advantage of BSL sharing the same API as Ibis is that LLMs are already fluent in Ibis :)</p><p>Additionally, LLMs can now execute their own Python code in a sandbox <a href="https://platform.openai.com/docs/guides/tools-code-interpreter">environment</a>.</p><p>This means that with BSL, giving an LLM access to your semantic model is as easy as handing over a YAML file with your model definition.</p><p>No MCP, no server, no hosting, nada&#8230; just a boring YAML file.</p><p>But&#8230; that&#8217;s a topic for the next post :)</p><div><hr></div><p>We are super excited by this new milestone for BSL.</p><p>We&#8217;re convinced that BSL is quickly becoming the lightest and most flexible semantic layer on the market.</p><p>A big thanks to all contributors who helped improve BSL over this summer.</p><p>If you share our enthusiasm:</p><ul><li><p>Explore the <a href="https://github.com/boringdata/boring-semantic-layer">repo</a></p></li><li><p>Give it a <a href="https://github.com/boringdata/boring-semantic-layer">&#11088;</a></p></li><li><p>And show us what you build with it!</p></li></ul><p>Thanks for reading,</p><p>Hussain &amp; Ju </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[The Semantic Modeling Loop]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 89]]></description><link>https://juhache.substack.com/p/the-semantic-modeling-loop</link><guid isPermaLink="false">https://juhache.substack.com/p/the-semantic-modeling-loop</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Wed, 09 Jul 2025 11:36:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c1817c67-e014-41a3-b058-d8348bdaac64_1086x1354.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I'm Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><p></p><div><hr></div><p>In the last episode of this <em><a href="https://github.com/boringdata/boring-semantic-layer">Boring Semantic Layer</a></em> mini-series, I wrote a lot about the tool from a consumer&#8217;s perspective.</p><p>Today, we welcome <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Benoit Pimpaud&quot;,&quot;id&quot;:23621089,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1700bc2d-b494-49e4-b282-f061f189382a_2883x2883.jpeg&quot;,&quot;uuid&quot;:&quot;f82c28db-e719-4b62-b694-8dd9b4467114&quot;}" data-component-name="MentionToDOM"></span> to the newsletter for a co-written post, where we approach the semantic layer not just as a consumption-only interface, but as a back-and-forth between modeling and consuming.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/boringdata/boring-semantic-layer&quot;,&quot;text&quot;:&quot;Boring Semantic Layer&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/boringdata/boring-semantic-layer"><span>Boring Semantic Layer</span></a></p><div><hr></div><p>John is a data analyst at a SaaS company called Monotone Labs.</p><p>It&#8217;s finally summertime, and for once, John has a bit of breathing room.</p><p>No urgent requests, no last-minute marketing campaigns.</p><p>Just time to step back and maybe look at the bigger picture.</p><p>After a long sunny lunch break, John returns to his desk around 1:00 p.m., slightly sweaty in his button-up shirt.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bqZo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bqZo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png 424w, https://substackcdn.com/image/fetch/$s_!bqZo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png 848w, https://substackcdn.com/image/fetch/$s_!bqZo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png 1272w, https://substackcdn.com/image/fetch/$s_!bqZo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bqZo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png" width="322" height="266.95726495726495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/efc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:388,&quot;width&quot;:468,&quot;resizeWidth&quot;:322,&quot;bytes&quot;:297539,&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://juhache.substack.com/i/167749380?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.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_!bqZo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png 424w, https://substackcdn.com/image/fetch/$s_!bqZo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png 848w, https://substackcdn.com/image/fetch/$s_!bqZo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.png 1272w, https://substackcdn.com/image/fetch/$s_!bqZo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc568bd-41c0-4fd3-b1eb-175228b0a8cf_468x388.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>He sits down, opens his laptop, and stares at the now-familiar AI chat interface &#8212; blank, blinking, waiting.</p><p>Then he remembers something a friend told him over drinks last week:</p><p><em>&#8220;I tested this open-source semantic layer tool on our sales data &#8212; works great with Claude.</em></p><p><em>You should give it a try.&#8221;</em></p><p>It clicks.</p><p>He hasn&#8217;t looked at sales volume since the last product launch a few months ago &#8212; maybe now&#8217;s the time.</p><p>Alright. Let&#8217;s see what this thing can do.</p><p>He opens his Claude Desktop settings and adds a new MCP config:</p><pre><code><code>{
  "mcpServers": {
    "cohort_sm": {
      "command": "uv",
      "args": [
        "run",
        "https://raw.githubusercontent.com/boringdata/boring-semantic-layer/refs/heads/main/examples/example_mcp_cohort.py"
    ]
    }
  }
}</code></code></pre><p><em>PS for reader: yes you can try as well :)</em></p><p>Boom &#8212; semantic layer connected.</p><p>No install. No setup.</p><p>Just Claude talking to a clean interface over John&#8217;s order data.</p><p>He types his first prompt:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pkRI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pkRI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png 424w, https://substackcdn.com/image/fetch/$s_!pkRI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png 848w, https://substackcdn.com/image/fetch/$s_!pkRI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png 1272w, https://substackcdn.com/image/fetch/$s_!pkRI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pkRI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png" width="528" height="124.74725274725274" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:344,&quot;width&quot;:1456,&quot;resizeWidth&quot;:528,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pkRI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png 424w, https://substackcdn.com/image/fetch/$s_!pkRI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png 848w, https://substackcdn.com/image/fetch/$s_!pkRI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png 1272w, https://substackcdn.com/image/fetch/$s_!pkRI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdfa87bc-534c-423b-8df4-a9758e028494_1600x378.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><em>&#129504; Claude thinks&#8230; calls the right tools&#8230; queries the model&#8230;</em></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;9ea09e9f-4967-44f3-9370-075c547e9ded&quot;,&quot;duration&quot;:null}"></div><p>And just like that &#8212; charts. Numbers. A real trend.</p><p>Not bad for a lazy Friday.</p><p>But John&#8217;s not done yet.</p><p>He wants to break this down by customer segment. </p><p>He tries:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!17sY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!17sY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png 424w, https://substackcdn.com/image/fetch/$s_!17sY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png 848w, https://substackcdn.com/image/fetch/$s_!17sY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png 1272w, https://substackcdn.com/image/fetch/$s_!17sY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!17sY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png" width="598" height="154.01785714285714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:375,&quot;width&quot;:1456,&quot;resizeWidth&quot;:598,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!17sY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png 424w, https://substackcdn.com/image/fetch/$s_!17sY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png 848w, https://substackcdn.com/image/fetch/$s_!17sY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png 1272w, https://substackcdn.com/image/fetch/$s_!17sY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0018ea75-c78d-41b5-8bb3-bf9d6123574d_1600x412.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Nothing. </p><p>Error.</p><p>Turns out the current semantic model doesn&#8217;t include customer data.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-ktr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-ktr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png 424w, https://substackcdn.com/image/fetch/$s_!-ktr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png 848w, https://substackcdn.com/image/fetch/$s_!-ktr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png 1272w, https://substackcdn.com/image/fetch/$s_!-ktr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-ktr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png" width="724" height="408.2445054945055" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:821,&quot;width&quot;:1456,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-ktr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png 424w, https://substackcdn.com/image/fetch/$s_!-ktr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png 848w, https://substackcdn.com/image/fetch/$s_!-ktr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png 1272w, https://substackcdn.com/image/fetch/$s_!-ktr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9538e190-1b4b-47ec-a1ed-962c1dc920b0_1600x902.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Semantic Model v0</figcaption></figure></div><p>Of course.</p><p>No panic. </p><p>He switches to Cursor, opens the repo, and finds the file that defines the semantic model.</p><p>He asks Claude:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_GDC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_GDC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png 424w, https://substackcdn.com/image/fetch/$s_!_GDC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png 848w, https://substackcdn.com/image/fetch/$s_!_GDC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png 1272w, https://substackcdn.com/image/fetch/$s_!_GDC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_GDC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png" width="1456" height="247" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:247,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_GDC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png 424w, https://substackcdn.com/image/fetch/$s_!_GDC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png 848w, https://substackcdn.com/image/fetch/$s_!_GDC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png 1272w, https://substackcdn.com/image/fetch/$s_!_GDC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb06c0a02-3a7f-4419-bfd4-389f74b3dec4_1600x271.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Claude proposes a change.</p><p>He reviews the code &#8212; makes sense.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CjIU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CjIU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png 424w, https://substackcdn.com/image/fetch/$s_!CjIU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png 848w, https://substackcdn.com/image/fetch/$s_!CjIU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!CjIU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CjIU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png" width="596" height="804.7257383966245" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1185,&quot;resizeWidth&quot;:596,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CjIU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png 424w, https://substackcdn.com/image/fetch/$s_!CjIU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png 848w, https://substackcdn.com/image/fetch/$s_!CjIU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!CjIU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698af798-20bf-49cb-a4d5-ff0f7e488e79_1185x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Semantic Model v1</figcaption></figure></div><p>He validates and reloads the model.</p><p>Now Claude can safely access customer info &#8212; no weird joins, no hallucinations.</p><p>While he&#8217;s at it, John figures: why not ask THE crazy question?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bPGm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bPGm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png 424w, https://substackcdn.com/image/fetch/$s_!bPGm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png 848w, https://substackcdn.com/image/fetch/$s_!bPGm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png 1272w, https://substackcdn.com/image/fetch/$s_!bPGm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bPGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png" width="602" height="142.23076923076923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:344,&quot;width&quot;:1456,&quot;resizeWidth&quot;:602,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bPGm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png 424w, https://substackcdn.com/image/fetch/$s_!bPGm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png 848w, https://substackcdn.com/image/fetch/$s_!bPGm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png 1272w, https://substackcdn.com/image/fetch/$s_!bPGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8c71be8-288c-4c19-a548-b27a66135ea0_1600x378.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>(Yes John does not like sentences&#8230;)</p><p></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;532caa49-75dc-497a-aa75-337695f27f14&quot;,&quot;duration&quot;:null}"></div><p>John leans back.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!78B6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!78B6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png 424w, https://substackcdn.com/image/fetch/$s_!78B6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png 848w, https://substackcdn.com/image/fetch/$s_!78B6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png 1272w, https://substackcdn.com/image/fetch/$s_!78B6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!78B6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png" width="248" height="378.12927756653994" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:802,&quot;width&quot;:526,&quot;resizeWidth&quot;:248,&quot;bytes&quot;:698831,&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://juhache.substack.com/i/167749380?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.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_!78B6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png 424w, https://substackcdn.com/image/fetch/$s_!78B6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png 848w, https://substackcdn.com/image/fetch/$s_!78B6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.png 1272w, https://substackcdn.com/image/fetch/$s_!78B6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d80266d-7fc4-4d3a-af59-a63ef5d5a261_526x802.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>He didn&#8217;t write a single SQL query.</p><p>He didn&#8217;t click a single dashboard filter.</p><p>Just natural language, a semantic layer, and a good chat interface.</p><h1>When One Question Leads to Ten</h1><p>John stares at the new chart.</p><p>It&#8217;s clear &#8212; there&#8217;s a trend worth digging into.</p><p>But instead of stopping there, he wonders: <em>&#8220;What else could I ask?&#8221;</em></p><p>One of the biggest leaps LLMs enable is the ability to ask <a href="https://fromanengineersight.substack.com/p/issue-39-whats-your-question">probing questions</a> &#8212; not just answer them.</p><p>This is a well-known prompting technique.</p><p>By encouraging the model to explore the problem space, it often uncovers angles we wouldn&#8217;t think of on our own.</p><p>But this isn&#8217;t new.</p><p>It&#8217;s what we do naturally with teammates &#8212; in meetings, at coffee machines &#8212; exchanging perspectives to deepen understanding and reveal blind spots.</p><p>So far, everything John&#8217;s done has been analyst-driven:</p><p>He asked a question &#8594; hit a gap &#8594; updated the model &#8594; asked again.</p><p>But what if he flipped the dynamic?</p><p>What if the semantic layer didn&#8217;t just respond &#8212; but evolved through the conversation itself?</p><p>What if the LLM could suggest the <em>next</em> question?</p><p>Let&#8217;s give it a try:</p><p>Start with one question.</p><p>The LLM responds &#8212; and proposes where to explore next.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ic8u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ic8u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png 424w, https://substackcdn.com/image/fetch/$s_!Ic8u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png 848w, https://substackcdn.com/image/fetch/$s_!Ic8u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png 1272w, https://substackcdn.com/image/fetch/$s_!Ic8u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ic8u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png" width="1456" height="266" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:266,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Ic8u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png 424w, https://substackcdn.com/image/fetch/$s_!Ic8u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png 848w, https://substackcdn.com/image/fetch/$s_!Ic8u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png 1272w, https://substackcdn.com/image/fetch/$s_!Ic8u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fe8fbf9-1023-4961-82b7-2c2e748b4a7f_1600x292.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;e7eb9ab6-cb22-4ddf-8260-5a5b2afa2c38&quot;,&quot;duration&quot;:null}"></div><p>A bunch of follow-up questions appear, each pointing to new angles:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RlSv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RlSv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png 424w, https://substackcdn.com/image/fetch/$s_!RlSv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png 848w, https://substackcdn.com/image/fetch/$s_!RlSv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png 1272w, https://substackcdn.com/image/fetch/$s_!RlSv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RlSv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png" width="654" height="394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:788,&quot;width&quot;:1308,&quot;resizeWidth&quot;:654,&quot;bytes&quot;:609883,&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://juhache.substack.com/i/167749380?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.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_!RlSv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png 424w, https://substackcdn.com/image/fetch/$s_!RlSv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png 848w, https://substackcdn.com/image/fetch/$s_!RlSv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.png 1272w, https://substackcdn.com/image/fetch/$s_!RlSv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc56950b8-59e1-43f6-9772-613f3f2760de_1308x788.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>John could just say &#8220;yes&#8221; and hope the model has what it needs to answer them.</p><p>But he knows better &#8212; the underlying semantics aren&#8217;t there yet.</p><p>Instead, he asks Claude to help build what&#8217;s missing.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;caf6926c-79c5-4aa5-879e-c4020acd5f0f&quot;,&quot;duration&quot;:null}"></div><p>John reviews it, tweaks a line or two, and approves.</p><p>They co-create the semantic definition together.</p><h1>Recursive Semantic Model Building</h1><p>With this experiment, we tried to illustrate how we imagine the future of analytics inside modern organizations:</p><ol><li><p>A human poses an initial question<br></p></li><li><p>The AI analyzes and identifies semantic gaps<br></p></li><li><p>The AI suggests related questions &#8212; the human refines or expands the scope<br></p></li><li><p>The semantic layer evolves organically, shaped by real questions<br></p></li></ol><p><strong>The cycle accelerates</strong>, enabling deeper, more sophisticated analysis over time</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K4zS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K4zS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png 424w, https://substackcdn.com/image/fetch/$s_!K4zS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png 848w, https://substackcdn.com/image/fetch/$s_!K4zS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png 1272w, https://substackcdn.com/image/fetch/$s_!K4zS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K4zS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png" width="1456" height="652" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:652,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:242124,&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://juhache.substack.com/i/167749380?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.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_!K4zS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png 424w, https://substackcdn.com/image/fetch/$s_!K4zS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png 848w, https://substackcdn.com/image/fetch/$s_!K4zS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png 1272w, https://substackcdn.com/image/fetch/$s_!K4zS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae7df4b2-6ce5-4681-b8b6-98cadf89ace9_2214x992.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This feedback loop isn&#8217;t just efficient &#8212; it solves a deeper, persistent issue in analytics: institutional memory.</p><p>In most companies, the same insights are rediscovered over and over because:</p><ul><li><p>Analysts leave</p></li><li><p>Business context gets lost</p></li><li><p>Past analyses become buried artifacts</p></li></ul><p>Traditional BI tools fall short here &#8212; they preserve <em>results</em>, but lose the <em>reasoning</em> behind them.</p><p>By contrast, a semantic model declared as code becomes a living artifact. </p><p>It can be:</p><ul><li><p>Versioned</p></li><li><p>Audited</p></li><li><p>Reviewed over time<br></p></li></ul><p>More importantly, tracking these feedback loops means we don&#8217;t just capture <em>what</em> was analyzed &#8212;but also <em>why</em>, <em>how</em>, and <em>what questions led there</em>.</p><p>That&#8217;s the foundation of analytics that learns &#8212; and remembers.</p><h1>In Data We Trust</h1><p>There are real limitations to this approach &#8212; and the biggest one is trust.</p><p>Letting an LLM write code to define your semantic layer is risky.</p><p>Semantics are inherently human &#8212; they reflect how <em>we</em> think about the business and what <em>we</em> care about.</p><p>Context engineering and iterative questioning help mitigate that risk &#8212; semantics gradually emerge through the conversation.</p><p>But still, it&#8217;s not foolproof.</p><p>When agents write application code, it&#8217;s easy to build trust:</p><p>If clicking a button produces the desired behavior, you don&#8217;t really need to read the code behind it.</p><p>But with data, it&#8217;s different.</p><p>You can&#8217;t trust a chart unless you trust the logic that produced it.</p><p>And validating that logic is <em>hard</em> &#8212; especially when it&#8217;s auto-generated.</p><p><strong>And yet &#8212; we love this chat BI experience.</strong></p><p>First, because the LLM <em>guides</em> you &#8212; it doesn&#8217;t just answer questions, it gives you new ideas to explore.</p><p>Secondly, as the interface is generated on the go, you can place yourself at the perfect zoom level.</p><p>BI dashboards are static and frozen, overloaded with details and information you can&#8217;t act on.</p><p>LLMs show you only what you need to see.</p><p>Similar to when you zoom in and out on Google Maps.</p><div id="youtube2-PAy_GHUAICw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;PAy_GHUAICw&quot;,&quot;startTime&quot;:&quot;362&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/PAy_GHUAICw?start=362&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>You&#8217;re not stuck staring at a frozen dashboard overloaded with stale KPIs.</p><p>You see just enough to make the next decision &#8212; and if you want more, just zoom.</p><p>That&#8217;s the magic: The LLM gives you the map with control over the zoom level &#8230;</p><div><hr></div><p>Thanks for reading</p><p>Beno&#238;t and Ju </p><p><em>Thanks Beno&#238;t for the super insightful collab (as always :) ).</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Boring Semantic Layer + MCP = 🔥]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 88]]></description><link>https://juhache.substack.com/p/boring-semantic-layer-mcp</link><guid isPermaLink="false">https://juhache.substack.com/p/boring-semantic-layer-mcp</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Fri, 04 Jul 2025 07:53:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ebbf49eb-3dc2-40df-94eb-618d95b2ba4c_994x1108.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I'm Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><div><hr></div><p>Last week we launched the boring semantic layer.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;eb3da808-c05e-474b-944b-65a7cedd9f8e&quot;,&quot;caption&quot;:&quot;Bonjour!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Launching: The Boring Semantic Layer&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-06-24T13:25:29.297Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19422915-bd7d-4875-8455-ad63e14576af_1014x1180.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/the-boring-semantic-layer&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:166380465,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:31,&quot;comment_count&quot;:5,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Ev6t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>The Boring Semantic Layer (BSL) is a lightweight semantic layer built on top of Ibis.</p><p>I love &#10084;&#65039; it because:</p><ul><li><p>It&#8217;s super light: pip install boring-semantic-layer</p></li><li><p>It&#8217;s Ibis-powered &#8212; meaning it works with almost any engine out of the box</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/boringdata/boring-semantic-layer&quot;,&quot;text&quot;:&quot;Boring Semantic Layer Github&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/boringdata/boring-semantic-layer"><span>Boring Semantic Layer Github</span></a></p></li></ul><div><hr></div><p>Today, I want to explore into how this connects with the MCP integration I mentioned in the launch post.</p><p>I started exploring the semantic layer space while experimenting with LLM interfaces for data.</p><p>If you take a brute-force approach and let an LLM query your raw tables directly, you&#8217;ll quickly run into hallucinations &#8212; things like:</p><ul><li><p>Wrong joins</p></li><li><p>Bad aggregations</p></li></ul><p>The semantic layer serves as an interface that defines pre-built aggregations and validated relationships &#8212; helping prevent those kinds of issues.</p><p>Take the flights example: we have two tables, flights and carriers.</p><p>Rather than exposing those raw tables to the LLM, we expose ready-to-query aggregations, such as:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jwE_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jwE_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png 424w, https://substackcdn.com/image/fetch/$s_!jwE_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png 848w, https://substackcdn.com/image/fetch/$s_!jwE_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!jwE_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jwE_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png" width="532" height="312.40384615384613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:855,&quot;width&quot;:1456,&quot;resizeWidth&quot;:532,&quot;bytes&quot;:201686,&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://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.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_!jwE_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png 424w, https://substackcdn.com/image/fetch/$s_!jwE_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png 848w, https://substackcdn.com/image/fetch/$s_!jwE_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!jwE_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18496fa2-e0aa-49f3-a00e-61b063f919bc_2132x1252.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>In this setup, the LLM can only aggregate the number of flights per origin and destination &#8212; nothing more.</p><p>That constraint is a feature, not a bug: it allows the LLM to focus on intent, not SQL correctness.</p><p>You&#8217;re trading SQL flexibility for reliability.</p><h1>MCP</h1><p><a href="https://docs.anthropic.com/en/docs/mcp">MCP</a> is a protocol designed to standardize how LLMs interact with external tools.</p><p>Each MCP exposes a set of so-called &#8220;tools&#8221; &#8212; think of them as API endpoints with predefined inputs and outputs.</p><p>When a user asks a question, LLMs are now trained to browse the available MCPs and identify the one they can use to handle the request.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i4w5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i4w5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png 424w, https://substackcdn.com/image/fetch/$s_!i4w5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png 848w, https://substackcdn.com/image/fetch/$s_!i4w5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png 1272w, https://substackcdn.com/image/fetch/$s_!i4w5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i4w5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png" width="437" height="305.9" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:700,&quot;width&quot;:1000,&quot;resizeWidth&quot;:437,&quot;bytes&quot;:62372,&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://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.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_!i4w5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png 424w, https://substackcdn.com/image/fetch/$s_!i4w5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png 848w, https://substackcdn.com/image/fetch/$s_!i4w5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.png 1272w, https://substackcdn.com/image/fetch/$s_!i4w5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff20c36fa-3b03-44cb-a47b-e075c9ff22d5_1000x700.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><h1>Python MCP</h1><p>Anthropic has released a Python SDK that implements the MCP protocol.</p><p>It allows you to build an MCP server that can be exposed to a client.</p><p>A client, in this context, could be Cursor, Claude Desktop, Claude Code, etc.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zU99!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zU99!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png 424w, https://substackcdn.com/image/fetch/$s_!zU99!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png 848w, https://substackcdn.com/image/fetch/$s_!zU99!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!zU99!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zU99!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png" width="521" height="313.4587912087912" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:876,&quot;width&quot;:1456,&quot;resizeWidth&quot;:521,&quot;bytes&quot;:178930,&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://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.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_!zU99!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png 424w, https://substackcdn.com/image/fetch/$s_!zU99!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png 848w, https://substackcdn.com/image/fetch/$s_!zU99!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.png 1272w, https://substackcdn.com/image/fetch/$s_!zU99!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe166cd0f-22fc-41d0-93eb-8b6a805a61c7_2080x1252.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>Using the @tool decorator, you can easily add tools to the MCP server.</p><p>When an LLM scans the MCP, it will see each tool along with its docstring documentation.</p><p>The docstring is crucial &#8212; it helps the LLM understand what the tool does and how to structure the input correctly.</p><h1>Semantic Layer + MCP</h1><p>In the context of our semantic layer, MCP acts as a bridge between the LLM and the Boring Semantic Layer.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BSdO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BSdO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png 424w, https://substackcdn.com/image/fetch/$s_!BSdO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png 848w, https://substackcdn.com/image/fetch/$s_!BSdO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png 1272w, https://substackcdn.com/image/fetch/$s_!BSdO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BSdO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png" width="1456" height="921" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:921,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:179897,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!BSdO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png 424w, https://substackcdn.com/image/fetch/$s_!BSdO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png 848w, https://substackcdn.com/image/fetch/$s_!BSdO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.png 1272w, https://substackcdn.com/image/fetch/$s_!BSdO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c920069-879e-472f-9ea9-b234ba197a0f_1572x994.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>Here&#8217;s how it works:</p><ol><li><p>The user asks a question to the LLM.</p></li><li><p>The LLM scans the available tools and calls the appropriate MCP tool with a corresponding query.</p></li><li><p>The MCP forwards the query to the Boring Semantic Layer, which translates it into SQL.</p></li><li><p>The results flow back to the LLM, which then formats the response in natural language.</p></li></ol><h1>BSM: SemanticMCP</h1><p>To enable a smooth integration between the Boring Semantic Layer (BSL) and an MCP, we introduced a new class this week: MCPSemanticModel.</p><p>It inherits from the original FastMCP class by Anthropic and extends it with a set of built-in tools that the LLM can use to query your data.</p><p>To use it, simply pass your semantic model as input to the MCPSemanticModel class.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6hMK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6hMK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png 424w, https://substackcdn.com/image/fetch/$s_!6hMK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png 848w, https://substackcdn.com/image/fetch/$s_!6hMK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png 1272w, https://substackcdn.com/image/fetch/$s_!6hMK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6hMK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png" width="581" height="373.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:936,&quot;width&quot;:1456,&quot;resizeWidth&quot;:581,&quot;bytes&quot;:322714,&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://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.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_!6hMK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png 424w, https://substackcdn.com/image/fetch/$s_!6hMK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png 848w, https://substackcdn.com/image/fetch/$s_!6hMK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.png 1272w, https://substackcdn.com/image/fetch/$s_!6hMK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57fe22-b182-434f-86b6-b660b17eacf3_2788x1792.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>Run this file, add the MCP to your client and that&#8217;s it !</p><p>The client&#8217;s LLM will be able to access your semantic layer.</p><p><em>(Check the demo section below if you want to try it yourself.)</em></p><p>The MCP server comes with a set of pre-implemented tools:</p><ul><li><p><strong>list_models</strong> &#8211; Returns the list of available semantic models.</p></li><li><p><strong>get_model</strong> &#8211; Fetches the definition of a specific semantic model.</p></li><li><p><strong>get_time_range</strong> &#8211; Retrieves the time range covered by a model&#8217;s data.</p></li><li><p><strong>query_model</strong> &#8211; Executes a query against a semantic model.</p></li></ul><p>Each tool includes a proper docstring, which acts as a prompt for the LLM.</p><p>This prompt is especially important for tools like query_model.</p><p>In the prompt, we explain to the LLM how to format its queries: the JSON format for filtering, the available time ranges, and more.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XVMK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XVMK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png 424w, https://substackcdn.com/image/fetch/$s_!XVMK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png 848w, https://substackcdn.com/image/fetch/$s_!XVMK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png 1272w, https://substackcdn.com/image/fetch/$s_!XVMK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XVMK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png" width="1456" height="614" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:614,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:174086,&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://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.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_!XVMK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png 424w, https://substackcdn.com/image/fetch/$s_!XVMK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png 848w, https://substackcdn.com/image/fetch/$s_!XVMK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.png 1272w, https://substackcdn.com/image/fetch/$s_!XVMK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc76f6fa-8d10-4726-adc5-b550d4cb9cfd_2180x920.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 beauty of this setup is its flexibility.</p><p>The MCPSemanticModel is just an instance of FastMCP.</p><p>You can enhance the MCPSemanticModel class as you wish: add new tools, add prompts, add resources, and more.</p><h1>Demo</h1><p>There is a ready-to-use MCP implementation in the repo <a href="https://github.com/boringdata/boring-semantic-layer/blob/main/examples/example_mcp.py">here</a>.</p><p>Just add this config to your <a href="https://modelcontextprotocol.io/quickstart/user">Claude Deskop MCP config file</a>:</p><p>Nothing to install (except uv) ! </p><pre><code><code>{
  "mcpServers": {
    "flight_sm": {
      "command": "uv",
      "args": [
        "run",
        "https://raw.githubusercontent.com/boringdata/boring-semantic-layer/refs/heads/main/examples/example_mcp.py"
    ]
    }
  }
}</code></code></pre><p>That&#8217;s it! Open your Claude Desktop, and you can start chatting with the flight data.</p><p>Let&#8217;s start by asking a simple question: </p><p><em>&#8220;top 10 flights destinations&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eqTT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eqTT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png 424w, https://substackcdn.com/image/fetch/$s_!eqTT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png 848w, https://substackcdn.com/image/fetch/$s_!eqTT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png 1272w, https://substackcdn.com/image/fetch/$s_!eqTT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eqTT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png" width="1456" height="1496" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1496,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:375726,&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://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.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_!eqTT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png 424w, https://substackcdn.com/image/fetch/$s_!eqTT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png 848w, https://substackcdn.com/image/fetch/$s_!eqTT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png 1272w, https://substackcdn.com/image/fetch/$s_!eqTT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc6caac-624f-4947-aa36-7db6c5b00428_1608x1652.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you look at the MCP call, the LLM goes through the following steps:</p><ol><li><p>Lists all the available models (datasets)</p></li><li><p>Retrieves more details about the flights model</p></li><li><p>Performs a query</p></li></ol><p>Now, let&#8217;s add a time dimension to the prompt:</p><p><em>&#8220;Analyze the quarterly flight number evolution in Boston.&#8221;</em></p><p>In this case, the model also uses get_time_range to verify the available date range in the dataset before running the query.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!t2YD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!t2YD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.png 424w, https://substackcdn.com/image/fetch/$s_!t2YD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.png 848w, https://substackcdn.com/image/fetch/$s_!t2YD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.png 1272w, https://substackcdn.com/image/fetch/$s_!t2YD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!t2YD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.png" width="1258" height="624" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/174f608a-5289-4876-91d9-a67134462c8b_1258x624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:624,&quot;width&quot;:1258,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91966,&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://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.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_!t2YD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.png 424w, https://substackcdn.com/image/fetch/$s_!t2YD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.png 848w, https://substackcdn.com/image/fetch/$s_!t2YD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.png 1272w, https://substackcdn.com/image/fetch/$s_!t2YD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F174f608a-5289-4876-91d9-a67134462c8b_1258x624.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>And then leverage the time_grain in the query() to aggregate data correctly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dg9m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dg9m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png 424w, https://substackcdn.com/image/fetch/$s_!dg9m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png 848w, https://substackcdn.com/image/fetch/$s_!dg9m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png 1272w, https://substackcdn.com/image/fetch/$s_!dg9m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dg9m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png" width="591" height="287.11041009463725" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:616,&quot;width&quot;:1268,&quot;resizeWidth&quot;:591,&quot;bytes&quot;:76353,&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://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.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_!dg9m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png 424w, https://substackcdn.com/image/fetch/$s_!dg9m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png 848w, https://substackcdn.com/image/fetch/$s_!dg9m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.png 1272w, https://substackcdn.com/image/fetch/$s_!dg9m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc7e405-730a-4cac-ab31-100501b56162_1268x616.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>Claude even generated a nice dashboard for us:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5fMy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5fMy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png 424w, https://substackcdn.com/image/fetch/$s_!5fMy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png 848w, https://substackcdn.com/image/fetch/$s_!5fMy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png 1272w, https://substackcdn.com/image/fetch/$s_!5fMy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5fMy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png" width="511" height="727.7399380804953" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1840,&quot;width&quot;:1292,&quot;resizeWidth&quot;:511,&quot;bytes&quot;:172391,&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://juhache.substack.com/i/167356177?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.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_!5fMy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png 424w, https://substackcdn.com/image/fetch/$s_!5fMy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png 848w, https://substackcdn.com/image/fetch/$s_!5fMy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.png 1272w, https://substackcdn.com/image/fetch/$s_!5fMy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11ca241a-06a6-4ee5-8275-3d2b2c2982e4_1292x1840.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>From the tests we ran, the LLM generally understands the prompts we provide about how to query the data model.</p><p>It does make occasional mistakes &#8212; for example: &#8220;Error executing tool query_model: Operator &#8216;in&#8217; requires &#8216;values&#8217; field.&#8221;</p><p>But what&#8217;s impressive is that it learns from the error message and often manages to correct itself in the next attempt.</p><h1>Next Step</h1><p>You got it &#8212; the LLM is only as good as your semantic model.</p><p>If a measure isn&#8217;t exposed, the LLM won&#8217;t be able to retrieve the information.</p><p>In that sense, building the semantic model is becoming the new bottleneck in the analytics process.</p><p>But wait&#8230;</p><p>Could the LLM help us build the semantic model itself?</p><p>Does it have to be an ad-hoc process?</p><p>What if we could build it incrementally, as users ask questions?</p><p>That&#8217;s exactly what we&#8217;ll explore with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Benoit Pimpaud&quot;,&quot;id&quot;:23621089,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1700bc2d-b494-49e4-b282-f061f189382a_2883x2883.jpeg&quot;,&quot;uuid&quot;:&quot;356e527a-6492-4f93-9c1b-0fc7e9d5c80d&quot;}" data-component-name="MentionToDOM"></span> in the next edition of the newsletter.</p><p>Stay tuned!</p><div><hr></div><p>We&#8217;d love to hear your feedback and welcome contributions &#8212; and don&#8217;t forget to &#11088; the <a href="https://github.com/boringdata/boring-semantic-layer">project</a>!</p><div><hr></div><p>Thanks for reading,</p><p>-Ju</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Launching: The Boring Semantic Layer]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 87]]></description><link>https://juhache.substack.com/p/the-boring-semantic-layer</link><guid isPermaLink="false">https://juhache.substack.com/p/the-boring-semantic-layer</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Tue, 24 Jun 2025 13:25:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/19422915-bd7d-4875-8455-ad63e14576af_1014x1180.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><blockquote><p>Bonjour!</p><p>I'm Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div></blockquote><div><hr></div><p><em>This post is brought to you by <a href="https://buf.build/">Bufstream</a>&#8212; a Kafka drop-in replacement with built-in schema enforcement.</em></p><p><em>Bufstream ensures data quality at the source by validating every message against a Protobuf schema &#8212; so bad data never enters your streams in the first place.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://fnf.dev/4kWXLdC&quot;,&quot;text&quot;:&quot;Read more about Bufstream&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://fnf.dev/4kWXLdC"><span>Read more about Bufstream</span></a></p><div><hr></div><h1>Yet another semantic layer!</h1><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8iz4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8iz4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png 424w, https://substackcdn.com/image/fetch/$s_!8iz4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png 848w, https://substackcdn.com/image/fetch/$s_!8iz4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png 1272w, https://substackcdn.com/image/fetch/$s_!8iz4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8iz4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png" width="512" height="204.01532567049807" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:416,&quot;width&quot;:1044,&quot;resizeWidth&quot;:512,&quot;bytes&quot;:107156,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.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_!8iz4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png 424w, https://substackcdn.com/image/fetch/$s_!8iz4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png 848w, https://substackcdn.com/image/fetch/$s_!8iz4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png 1272w, https://substackcdn.com/image/fetch/$s_!8iz4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0126b210-7c25-4af6-8750-6f7082a96b16_1044x416.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>I&#8217;m currently working with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;David Krevitt&quot;,&quot;id&quot;:4194838,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/c6361b0a-1c0d-49be-b5a9-6f6779e29fa7_2909x2909.jpeg&quot;,&quot;uuid&quot;:&quot;3ac1d3e4-822d-4266-a94f-99562b6b4489&quot;}" data-component-name="MentionToDOM"></span>, leveraging <a href="https://www.boringdata.io/">Boring Data templates</a> to build vertical data products.</p><p>One of our core assumptions is that MCP-only interfaces can disrupt traditional UI-based data products.</p><p>While building our first product, which manages Stripe failed payment dunning, we noticed a major limitation:</p><p>LLMs struggle to generate correct SQL queries when retrieving data from a DB.</p><p>They often:</p><ul><li><p>Misinterpret the join relationships</p></li><li><p>Get confused about column meanings or context</p></li></ul><p>Our key takeaway:</p><p><strong>&#128073; We need a semantic layer! </strong></p><p>By enforcing consistent data access patterns, this semantic layer helps reduce the error rate of the LLM.</p><p>I researched the available tools on the market.</p><p>I wanted a simple Python package that I can use directly within my MCP implementation:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QSEN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QSEN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png 424w, https://substackcdn.com/image/fetch/$s_!QSEN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png 848w, https://substackcdn.com/image/fetch/$s_!QSEN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png 1272w, https://substackcdn.com/image/fetch/$s_!QSEN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QSEN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png" width="581" height="350.87033747779753" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1126,&quot;resizeWidth&quot;:581,&quot;bytes&quot;:144396,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.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_!QSEN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png 424w, https://substackcdn.com/image/fetch/$s_!QSEN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png 848w, https://substackcdn.com/image/fetch/$s_!QSEN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.png 1272w, https://substackcdn.com/image/fetch/$s_!QSEN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f84f83-4dc4-4ae1-82e2-7033658f148c_1126x680.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 haven&#8217;t found anything that fully meets my needs: open, composable, and &#8230; simple. </p><p>Semantic layer tools fall into one of the following categories:</p><ul><li><p>Not Open Source:</p><ul><li><p><a href="https://github.com/dbt-labs/metricflow">dbt MetricFlow</a></p></li><li><p><a href="https://docs.snowflake.com/en/user-guide/views-semantic/overview">Snowflake Semantic Layer</a></p></li></ul></li></ul><ul><li><p>Bundled with a larger platform:</p><ul><li><p><a href="https://www.rilldata.com/">Rill Data</a></p></li></ul></li><li><p>Requires hosting a dedicated service:</p><ul><li><p><a href="https://cube.dev/">Cube.dev</a></p></li><li><p><a href="https://datajunction.io/">DataJunction</a></p></li></ul></li></ul><p>The best option I found was Malloy.</p><p>But Malloy isn&#8217;t easily embeddable in Python as far as I know, and I&#8217;m concerned that LLMs may struggle to generate correct Malloy queries.</p><p>So&#8230;</p><p>We partnered up with <a href="https://www.linkedin.com/in/hussainsultan/">Hussain Sultan</a> from <a href="https://github.com/xorq-labs/xorq?tab=readme-ov-file">xorq-labs</a> (a multi-engine version of ibis) and built the simplest semantic layer on earth: <a href="https://github.com/boringdata/boring-semantic-layer">boring-semantic-layer</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g-Wb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g-Wb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png 424w, https://substackcdn.com/image/fetch/$s_!g-Wb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png 848w, https://substackcdn.com/image/fetch/$s_!g-Wb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png 1272w, https://substackcdn.com/image/fetch/$s_!g-Wb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g-Wb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png" width="1456" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:184237,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.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_!g-Wb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png 424w, https://substackcdn.com/image/fetch/$s_!g-Wb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png 848w, https://substackcdn.com/image/fetch/$s_!g-Wb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.png 1272w, https://substackcdn.com/image/fetch/$s_!g-Wb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2ad5c05-064c-4a92-a9c9-700c0e64a0ae_2188x716.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>It has two main differentiators:</p><ul><li><p><strong>Lightweight:</strong> Just pip install boring-semantic-layer</p></li><li><p><strong>Built on top of Ibis:</strong> Supports any engine Ibis integrates with</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/boringdata/boring-semantic-layer&quot;,&quot;text&quot;:&quot;Boring Semantic Layer&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/boringdata/boring-semantic-layer"><span>Boring Semantic Layer</span></a></p><h1>Demo Time!</h1><p>Let&#8217;s take a look at how our semantic layer works.</p><h2>Step 1: Define your semantic model</h2><p>With <strong>boring-semantic-layer</strong>, you define your semantic model using a SemanticModel class:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uez6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uez6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png 424w, https://substackcdn.com/image/fetch/$s_!uez6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png 848w, https://substackcdn.com/image/fetch/$s_!uez6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png 1272w, https://substackcdn.com/image/fetch/$s_!uez6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uez6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png" width="544" height="376.989010989011" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.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;:544,&quot;bytes&quot;:221712,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!uez6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png 424w, https://substackcdn.com/image/fetch/$s_!uez6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png 848w, https://substackcdn.com/image/fetch/$s_!uez6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.png 1272w, https://substackcdn.com/image/fetch/$s_!uez6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe238241e-cb81-443d-a5cf-c3b462075ef1_2136x1480.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>Each model is built on top of an Ibis table &#8212; meaning it works with any backend Ibis supports, like DuckDB, BigQuery, Snowflake, and more.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ilsp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ilsp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png 424w, https://substackcdn.com/image/fetch/$s_!Ilsp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png 848w, https://substackcdn.com/image/fetch/$s_!Ilsp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png 1272w, https://substackcdn.com/image/fetch/$s_!Ilsp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ilsp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png" width="592" height="313.8901098901099" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:1456,&quot;resizeWidth&quot;:592,&quot;bytes&quot;:449335,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.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_!Ilsp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png 424w, https://substackcdn.com/image/fetch/$s_!Ilsp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png 848w, https://substackcdn.com/image/fetch/$s_!Ilsp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png 1272w, https://substackcdn.com/image/fetch/$s_!Ilsp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6b99d59-75eb-41d9-81bc-254bf998ed0b_1970x1044.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://ibis-project.org/">source</a> </figcaption></figure></div><p>Example with DuckDB and Parquet:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZBR2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZBR2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png 424w, https://substackcdn.com/image/fetch/$s_!ZBR2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png 848w, https://substackcdn.com/image/fetch/$s_!ZBR2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png 1272w, https://substackcdn.com/image/fetch/$s_!ZBR2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZBR2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png" width="573" height="166.07554945054946" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:422,&quot;width&quot;:1456,&quot;resizeWidth&quot;:573,&quot;bytes&quot;:100615,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ZBR2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png 424w, https://substackcdn.com/image/fetch/$s_!ZBR2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png 848w, https://substackcdn.com/image/fetch/$s_!ZBR2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png 1272w, https://substackcdn.com/image/fetch/$s_!ZBR2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F856ef8df-c14b-4db1-956c-c694d19d4b8b_2320x672.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Once you&#8217;ve defined your table, you can declare your dimensions and measures:</p><ul><li><p><strong>Dimensions</strong> describe <em>how</em> you slice your data &#8212; e.g. country, user_cohort, or time_of_day.</p><p>Think of them as the &#8220;<strong>by</strong>&#8221; in &#8220;group by&#8221;: <em>flights by origin</em>, <em>users by signup_date</em>.</p></li><li><p><strong>Measures</strong> define <em>what</em> you measure &#8212; e.g. total_revenue, unique_users, or average_order_value.</p><p>These are usually aggregations or calculations.</p></li></ul><p>All dimensions and measures are expressed as <strong>Ibis expressions</strong> &#8212; which are Python functions representing database operations. </p><p>This gives you a clean, backend-agnostic way to express logic.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WXUl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WXUl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png 424w, https://substackcdn.com/image/fetch/$s_!WXUl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png 848w, https://substackcdn.com/image/fetch/$s_!WXUl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png 1272w, https://substackcdn.com/image/fetch/$s_!WXUl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WXUl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png" width="556" height="153.12912087912088" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:401,&quot;width&quot;:1456,&quot;resizeWidth&quot;:556,&quot;bytes&quot;:85481,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.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_!WXUl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png 424w, https://substackcdn.com/image/fetch/$s_!WXUl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png 848w, https://substackcdn.com/image/fetch/$s_!WXUl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png 1272w, https://substackcdn.com/image/fetch/$s_!WXUl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f03e2c-0c7a-474b-8e0e-e186ccbc4687_2104x580.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The t parameter represents your Ibis table &#8212; and you can chain operations naturally, like you would with pandas.</p><p>Ibis compiles these expressions into optimized SQL for the target engine &#8212; whether it&#8217;s DuckDB, Postgres, BigQuery, or others.</p><h2>Step 2: Query your semantic model</h2><p>Once defined, the semantic model exposes a <code>.query()</code> method that lets you combine dimensions and measures.</p><p>For example, if you want to count the number of flights by origin, run:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mrD7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mrD7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png 424w, https://substackcdn.com/image/fetch/$s_!mrD7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png 848w, https://substackcdn.com/image/fetch/$s_!mrD7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png 1272w, https://substackcdn.com/image/fetch/$s_!mrD7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mrD7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png" width="501" height="183.05769230769232" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:532,&quot;width&quot;:1456,&quot;resizeWidth&quot;:501,&quot;bytes&quot;:93357,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.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_!mrD7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png 424w, https://substackcdn.com/image/fetch/$s_!mrD7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png 848w, https://substackcdn.com/image/fetch/$s_!mrD7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png 1272w, https://substackcdn.com/image/fetch/$s_!mrD7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f0bd30-d84b-463d-a783-3e26587f7b7d_2080x760.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This returns a DataFrame like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MMfx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MMfx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png 424w, https://substackcdn.com/image/fetch/$s_!MMfx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png 848w, https://substackcdn.com/image/fetch/$s_!MMfx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png 1272w, https://substackcdn.com/image/fetch/$s_!MMfx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MMfx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png" width="192" height="245.97235023041475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:556,&quot;width&quot;:434,&quot;resizeWidth&quot;:192,&quot;bytes&quot;:29690,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.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_!MMfx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png 424w, https://substackcdn.com/image/fetch/$s_!MMfx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png 848w, https://substackcdn.com/image/fetch/$s_!MMfx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.png 1272w, https://substackcdn.com/image/fetch/$s_!MMfx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf3fc0d6-6a1c-4e78-b80a-308235f46432_434x556.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>Under the hood, the Ibis expressions are compiled into SQL to query the underlying data sources.</p><p>As you can see, the <code>.query()</code> interface is much more restrictive by design.</p><p>By only allowing dimensions and measures to be specified, the input is tightly constrained, making it far less error-prone.</p><h1>Filtering</h1><p>Querying dimensions and measures is great &#8212; but you also need a way to filter data dynamically to answer more specific user questions.</p><p>The easiest way to add filters to a query is, of course, by using Ibis expressions:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D1Qc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D1Qc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png 424w, https://substackcdn.com/image/fetch/$s_!D1Qc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png 848w, https://substackcdn.com/image/fetch/$s_!D1Qc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!D1Qc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D1Qc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png" width="496" height="245.95604395604394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:1456,&quot;resizeWidth&quot;:496,&quot;bytes&quot;:127869,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.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_!D1Qc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png 424w, https://substackcdn.com/image/fetch/$s_!D1Qc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png 848w, https://substackcdn.com/image/fetch/$s_!D1Qc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!D1Qc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8911e7ed-1e04-41c0-b2af-39c5a11bf75b_2080x1032.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>However, there&#8217;s a catch: Ibis expressions are difficult to serialize, which makes them hard for an LLM to generate or interact with.</p><p>To address this, we&#8217;ve implemented an additional filtering option: JSON-based filtering.</p><p>Instead of writing Ibis expressions directly, the user can specify filters using a simple JSON format:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tzJf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tzJf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png 424w, https://substackcdn.com/image/fetch/$s_!tzJf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png 848w, https://substackcdn.com/image/fetch/$s_!tzJf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png 1272w, https://substackcdn.com/image/fetch/$s_!tzJf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tzJf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png" width="1456" height="637" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:637,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:269152,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.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_!tzJf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png 424w, https://substackcdn.com/image/fetch/$s_!tzJf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png 848w, https://substackcdn.com/image/fetch/$s_!tzJf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png 1272w, https://substackcdn.com/image/fetch/$s_!tzJf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ccfabb-8755-4e06-97ab-bf240c2a39b9_3592x1572.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This filtering approach is much more LLM-friendly and covers all basic filtering needs using standard operators.</p><p>However, this solution doesn&#8217;t cover more complex filtering and transformations, especially those involving time-based logic.</p><p>To address that, we&#8217;ve implemented a dedicated time-based query mechanism, inspired by <a href="https://docs.rilldata.com/explore/mcp">Rill&#8217;s MCP implementation</a>.</p><p>To use it, simply define a <code>time_dimensions</code> in your SemanticModel that points to a timestamp column:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yUBc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yUBc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png 424w, https://substackcdn.com/image/fetch/$s_!yUBc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png 848w, https://substackcdn.com/image/fetch/$s_!yUBc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!yUBc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yUBc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png" width="484" height="302.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:484,&quot;bytes&quot;:142989,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.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_!yUBc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png 424w, https://substackcdn.com/image/fetch/$s_!yUBc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png 848w, https://substackcdn.com/image/fetch/$s_!yUBc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!yUBc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd116d3-f314-49f9-8955-b43826bf48bb_2080x1300.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 user can then perform simple time-based aggregations using the time_range and time_grain parameters of the .query() method.</p><p>This makes time-based analysis incredibly easy.</p><p>Want the number of flights per day in January? </p><p>Just write:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j-O7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j-O7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png 424w, https://substackcdn.com/image/fetch/$s_!j-O7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png 848w, https://substackcdn.com/image/fetch/$s_!j-O7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png 1272w, https://substackcdn.com/image/fetch/$s_!j-O7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j-O7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png" width="618" height="225.38324175824175" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:531,&quot;width&quot;:1456,&quot;resizeWidth&quot;:618,&quot;bytes&quot;:158435,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j-O7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png 424w, https://substackcdn.com/image/fetch/$s_!j-O7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png 848w, https://substackcdn.com/image/fetch/$s_!j-O7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png 1272w, https://substackcdn.com/image/fetch/$s_!j-O7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0349a84-04a7-4b32-8e56-635681db7de4_2576x940.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Want the year-to-date (YTD) number of flights?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-p76!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-p76!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png 424w, https://substackcdn.com/image/fetch/$s_!-p76!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png 848w, https://substackcdn.com/image/fetch/$s_!-p76!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png 1272w, https://substackcdn.com/image/fetch/$s_!-p76!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-p76!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png" width="620" height="226.11263736263737" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:531,&quot;width&quot;:1456,&quot;resizeWidth&quot;:620,&quot;bytes&quot;:159228,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.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_!-p76!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png 424w, https://substackcdn.com/image/fetch/$s_!-p76!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png 848w, https://substackcdn.com/image/fetch/$s_!-p76!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png 1272w, https://substackcdn.com/image/fetch/$s_!-p76!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66dd09df-a97e-4554-855c-40a76861ed16_2576x940.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Super simple and flexible.</p><h1>Join</h1><p>In most cases, tables are exposed in a normalized form, split across multiple tables.</p><p>These relationships should be abstracted away from the semantic layer consumer.</p><p>To handle this, we expose a Join class that allows you to define relationships between semantic models.</p><p>Let&#8217;s stick with the flight example from earlier.</p><p>Now, we&#8217;ll add a new semantic model: carriers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GXkC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GXkC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png 424w, https://substackcdn.com/image/fetch/$s_!GXkC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png 848w, https://substackcdn.com/image/fetch/$s_!GXkC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png 1272w, https://substackcdn.com/image/fetch/$s_!GXkC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GXkC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png" width="504" height="358.61538461538464" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1036,&quot;width&quot;:1456,&quot;resizeWidth&quot;:504,&quot;bytes&quot;:215655,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.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_!GXkC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png 424w, https://substackcdn.com/image/fetch/$s_!GXkC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png 848w, https://substackcdn.com/image/fetch/$s_!GXkC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png 1272w, https://substackcdn.com/image/fetch/$s_!GXkC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e82b6d6-cfab-48ee-ae30-72ac681765a6_2080x1480.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We can now enhance our flight semantic model by using the joins argument:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mq-e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mq-e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png 424w, https://substackcdn.com/image/fetch/$s_!mq-e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png 848w, https://substackcdn.com/image/fetch/$s_!mq-e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png 1272w, https://substackcdn.com/image/fetch/$s_!mq-e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mq-e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png" width="575" height="433.2245879120879" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1097,&quot;width&quot;:1456,&quot;resizeWidth&quot;:575,&quot;bytes&quot;:333430,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.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_!mq-e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png 424w, https://substackcdn.com/image/fetch/$s_!mq-e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png 848w, https://substackcdn.com/image/fetch/$s_!mq-e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.png 1272w, https://substackcdn.com/image/fetch/$s_!mq-e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F359ad67d-5ed6-4d69-b70a-8f545ac6f904_2680x2020.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 end user can now query carrier information without having to think about any joins:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VcZ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VcZ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png 424w, https://substackcdn.com/image/fetch/$s_!VcZ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png 848w, https://substackcdn.com/image/fetch/$s_!VcZ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png 1272w, https://substackcdn.com/image/fetch/$s_!VcZ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VcZ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png" width="436" height="178.47252747252747" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:596,&quot;width&quot;:1456,&quot;resizeWidth&quot;:436,&quot;bytes&quot;:96325,&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://juhache.substack.com/i/166380465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.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_!VcZ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png 424w, https://substackcdn.com/image/fetch/$s_!VcZ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png 848w, https://substackcdn.com/image/fetch/$s_!VcZ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png 1272w, https://substackcdn.com/image/fetch/$s_!VcZ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d6d496-7289-4723-98c1-23f25922a5c9_2080x852.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h1>Next Step</h1><p>We&#8217;re really excited about the <strong>boring-semantic-layer</strong>!</p><p>In the coming weeks, we&#8217;ll be adding:</p><ul><li><p>A YAML interface</p></li><li><p>Charting support</p></li><li><p>MCP support</p></li><li><p>Materialization and caching support</p></li></ul><p>We&#8217;ve already seen very promising results with MCP and will share more in a follow-up post.</p><p>Check out the demo video:</p><div id="youtube2-whOXkJMvwG0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;whOXkJMvwG0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/whOXkJMvwG0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>We&#8217;d love to hear your feedback and welcome contributions &#8212; and don&#8217;t forget to &#11088; the <a href="https://github.com/boringdata/boring-semantic-layer">project</a>!</p><p>We&#8217;ll also be sharing updates with David about the product we&#8217;re building on top of the boring-semantic-layer.</p><p>Stay tuned!</p><div><hr></div><p>Thanks for reading,</p><p>-Ju</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Iceberg = Your AI Hedge]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 86]]></description><link>https://juhache.substack.com/p/iceberg-your-ai-hedge</link><guid isPermaLink="false">https://juhache.substack.com/p/iceberg-your-ai-hedge</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Mon, 16 Jun 2025 11:31:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0001568d-5f25-44e1-bbda-d9b4fcb12bd7_1200x1500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I'm Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p></blockquote><p>I gave a talk last week at a meetup in Z&#252;rich. </p><p>In this post, I&#8217;ll walk you through the slides I presented and share some context around each one.</p><div id="youtube2-DSHvLo1x1Ks" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;DSHvLo1x1Ks&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/DSHvLo1x1Ks?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p>Today I wanted to talk about one of my customers: &#8220;Tumport&#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_!i8Ux!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i8Ux!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png 424w, https://substackcdn.com/image/fetch/$s_!i8Ux!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png 848w, https://substackcdn.com/image/fetch/$s_!i8Ux!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!i8Ux!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i8Ux!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png" width="437" height="250.6146978021978" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:835,&quot;width&quot;:1456,&quot;resizeWidth&quot;:437,&quot;bytes&quot;:2510095,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.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_!i8Ux!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png 424w, https://substackcdn.com/image/fetch/$s_!i8Ux!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png 848w, https://substackcdn.com/image/fetch/$s_!i8Ux!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!i8Ux!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe227a21d-5f36-4ab9-b828-4316ca19e7b9_2100x1204.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>They operate in the Trumportation of goods between China and Greenland&#8230;</p><p>I had a conversation the other day with their CTO:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s8p6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s8p6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png 424w, https://substackcdn.com/image/fetch/$s_!s8p6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png 848w, https://substackcdn.com/image/fetch/$s_!s8p6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png 1272w, https://substackcdn.com/image/fetch/$s_!s8p6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s8p6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png" width="502" height="463.13548387096773" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1144,&quot;width&quot;:1240,&quot;resizeWidth&quot;:502,&quot;bytes&quot;:1762059,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.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_!s8p6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png 424w, https://substackcdn.com/image/fetch/$s_!s8p6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png 848w, https://substackcdn.com/image/fetch/$s_!s8p6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.png 1272w, https://substackcdn.com/image/fetch/$s_!s8p6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99492ebf-a703-4b93-87f7-9ef497fa9a06_1240x1144.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>And he was quite worried&#8230;</p><p>Why? </p><p>Because on one hand, his business is under strong pressure to integrate AI</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a9Vp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a9Vp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png 424w, https://substackcdn.com/image/fetch/$s_!a9Vp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png 848w, https://substackcdn.com/image/fetch/$s_!a9Vp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png 1272w, https://substackcdn.com/image/fetch/$s_!a9Vp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a9Vp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png" width="358" height="240.3898916967509" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:744,&quot;width&quot;:1108,&quot;resizeWidth&quot;:358,&quot;bytes&quot;:979439,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.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_!a9Vp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png 424w, https://substackcdn.com/image/fetch/$s_!a9Vp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png 848w, https://substackcdn.com/image/fetch/$s_!a9Vp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.png 1272w, https://substackcdn.com/image/fetch/$s_!a9Vp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1892f4f-b28e-4980-bc12-a904e7d17d24_1108x744.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>But on the other hand, he has a bad gut feeling.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2_qe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2_qe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png 424w, https://substackcdn.com/image/fetch/$s_!2_qe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png 848w, https://substackcdn.com/image/fetch/$s_!2_qe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png 1272w, https://substackcdn.com/image/fetch/$s_!2_qe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2_qe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png" width="334" height="411.834808259587" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:836,&quot;width&quot;:678,&quot;resizeWidth&quot;:334,&quot;bytes&quot;:821543,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.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_!2_qe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png 424w, https://substackcdn.com/image/fetch/$s_!2_qe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png 848w, https://substackcdn.com/image/fetch/$s_!2_qe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.png 1272w, https://substackcdn.com/image/fetch/$s_!2_qe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9247be5a-13b0-4044-a7b5-04ab73b5b178_678x836.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>Why?</p><p>First of all, he hates (data &#128516;) migrations &#8212; and for good reason:</p><p>Most of them go over budget:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-4Ta!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-4Ta!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png 424w, https://substackcdn.com/image/fetch/$s_!-4Ta!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png 848w, https://substackcdn.com/image/fetch/$s_!-4Ta!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png 1272w, https://substackcdn.com/image/fetch/$s_!-4Ta!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-4Ta!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png" width="369" height="338.7089552238806" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:738,&quot;width&quot;:804,&quot;resizeWidth&quot;:369,&quot;bytes&quot;:81052,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.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_!-4Ta!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png 424w, https://substackcdn.com/image/fetch/$s_!-4Ta!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png 848w, https://substackcdn.com/image/fetch/$s_!-4Ta!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png 1272w, https://substackcdn.com/image/fetch/$s_!-4Ta!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b32f0cb-86eb-4086-a343-448933eaabe1_804x738.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/cloud-migration-opportunity-business-value-grows-but-missteps-abound</figcaption></figure></div><p>And in today&#8217;s fast-moving AI world, the market is so unstable that if he chooses a provider now&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FaOE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FaOE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png 424w, https://substackcdn.com/image/fetch/$s_!FaOE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png 848w, https://substackcdn.com/image/fetch/$s_!FaOE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png 1272w, https://substackcdn.com/image/fetch/$s_!FaOE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FaOE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png" width="1456" height="594" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:594,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:684178,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.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_!FaOE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png 424w, https://substackcdn.com/image/fetch/$s_!FaOE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png 848w, https://substackcdn.com/image/fetch/$s_!FaOE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.png 1272w, https://substackcdn.com/image/fetch/$s_!FaOE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2c4d6e3-7437-4cc9-b59a-95f43df7d251_1970x804.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>Will he be forced to migrate again in six months?</p><p>Will the tools still exist?</p><p>Will the pricing still make sense?</p><p>But then he told me there&#8217;s something he&#8217;s even more worried about:</p><p>Big Tech is pouring massive amounts of money into AI.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wjx6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wjx6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png 424w, https://substackcdn.com/image/fetch/$s_!Wjx6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png 848w, https://substackcdn.com/image/fetch/$s_!Wjx6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png 1272w, https://substackcdn.com/image/fetch/$s_!Wjx6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wjx6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png" width="555" height="141.31416837782342" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:248,&quot;width&quot;:974,&quot;resizeWidth&quot;:555,&quot;bytes&quot;:90784,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.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_!Wjx6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png 424w, https://substackcdn.com/image/fetch/$s_!Wjx6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png 848w, https://substackcdn.com/image/fetch/$s_!Wjx6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png 1272w, https://substackcdn.com/image/fetch/$s_!Wjx6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ba0fe85-ea8d-400f-a4af-8b063fb61399_974x248.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>But if we look at how AI is being implemented in companies, it&#8217;s still early days&#8230;</p><p>Capgemini, for example, reported that only 6% (&#128558;) of their bookings in Q1 2025 were AI-related.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2rez!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2rez!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png 424w, https://substackcdn.com/image/fetch/$s_!2rez!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png 848w, https://substackcdn.com/image/fetch/$s_!2rez!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png 1272w, https://substackcdn.com/image/fetch/$s_!2rez!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2rez!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png" width="176" height="207.8552036199095" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3139fe2-e129-4341-88d1-612424ac2832_442x522.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:522,&quot;width&quot;:442,&quot;resizeWidth&quot;:176,&quot;bytes&quot;:65331,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.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_!2rez!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png 424w, https://substackcdn.com/image/fetch/$s_!2rez!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png 848w, https://substackcdn.com/image/fetch/$s_!2rez!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png 1272w, https://substackcdn.com/image/fetch/$s_!2rez!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3139fe2-e129-4341-88d1-612424ac2832_442x522.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>There are two possible explanations:</p><ul><li><p>Companies are slow to adopt ?!?</p></li><li><p>AI does not work (yet)</p></li></ul><p>So if AI fails to deliver on its promises&#8230;</p><p>Who&#8217;s going to pay the bill?</p><p>Probably us &#8212; the cloud consumers.</p><p>And cloud costs?</p><p>They&#8217;re about to explode.</p><div><hr></div><p>The question, therefore, is how to protect yourself against all these instabilities.</p><p>This is particularly true in Europe, where tech sovereignty is becoming an increasingly important priority.</p><p>I don&#8217;t think the answer is to stop using the cloud, stop using cloud warehouses, or stop integrating AI.</p><p>The answer is to start decoupling.</p><p>Decoupling means separating where you store your data from where and how it&#8217;s used.</p><p>Or, put differently:</p><p>Choose wisely where you store your data.</p><p>Then, leverage tools only for their compute capabilities (AI, cloud warehouses).</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;c2b6798a-4734-4e37-8203-35b54f528e9c&quot;,&quot;caption&quot;:&quot;Bonjour!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Escaping Vendor Lock-In&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null},{&quot;id&quot;:23621089,&quot;name&quot;:&quot;Benoit Pimpaud&quot;,&quot;bio&quot;:&quot;Writing From An Engineer Sight, a periodic about data, engineering and design.\nhttps://fromanengineersight.substack.com/&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1700bc2d-b494-49e4-b282-f061f189382a_2883x2883.jpeg&quot;,&quot;is_guest&quot;:true,&quot;bestseller_tier&quot;:null,&quot;primaryPublicationSubscribeUrl&quot;:&quot;https://fromanengineersight.substack.com/subscribe?&quot;,&quot;primaryPublicationUrl&quot;:&quot;https://fromanengineersight.substack.com&quot;,&quot;primaryPublicationName&quot;:&quot;From An Engineer Sight&quot;,&quot;primaryPublicationId&quot;:256742}],&quot;post_date&quot;:&quot;2024-09-05T12:43:49.189Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092d50e-adcf-4324-ae84-6ee82fcc9f5d_858x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/escaping-vendor-lock-in&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:148526839,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:28,&quot;comment_count&quot;:6,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>In this situation, Open Table Formats represent an incredible opportunity to decouple your data stack.</p><p>Why?</p><p>&#8220;Traditionally,&#8221; there have been two main ways to build a data stack:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xEMg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xEMg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png 424w, https://substackcdn.com/image/fetch/$s_!xEMg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png 848w, https://substackcdn.com/image/fetch/$s_!xEMg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png 1272w, https://substackcdn.com/image/fetch/$s_!xEMg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xEMg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png" width="1456" height="471" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:471,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:368519,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.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_!xEMg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png 424w, https://substackcdn.com/image/fetch/$s_!xEMg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png 848w, https://substackcdn.com/image/fetch/$s_!xEMg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.png 1272w, https://substackcdn.com/image/fetch/$s_!xEMg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3247f83-c4cf-4518-987a-f4f0b7161b45_2228x720.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><ul><li><p>Warehouse-centered approach:</p><p>Pick one cloud data warehouse and go all-in.</p></li></ul><p>&#9989; Great developer experience </p><p>&#10060; lock-in. Switching providers is painful and requires copying data around</p><ul><li><p>Data lake&#8211;centered approach</p><p>Store raw Parquet files in an object storage bucket.</p></li></ul><p>&#9989; Easy to set up and inexpensive to get started.</p><p>&#10060; Can quickly become chaotic (no schema enforcement/evolution)</p><p>Open Table Formats get the best of both worlds by storing metadata about your data alongside Parquet files in a cloud storage bucket.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4hf2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4hf2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png 424w, https://substackcdn.com/image/fetch/$s_!4hf2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png 848w, https://substackcdn.com/image/fetch/$s_!4hf2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png 1272w, https://substackcdn.com/image/fetch/$s_!4hf2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4hf2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png" width="582" height="294.1978021978022" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:736,&quot;width&quot;:1456,&quot;resizeWidth&quot;:582,&quot;bytes&quot;:311562,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.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_!4hf2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png 424w, https://substackcdn.com/image/fetch/$s_!4hf2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png 848w, https://substackcdn.com/image/fetch/$s_!4hf2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.png 1272w, https://substackcdn.com/image/fetch/$s_!4hf2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a306a43-8187-41aa-8eed-d992557814b1_1828x924.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>Getting control over metadata is incredibly powerful.</p><p>From a technical perspective, it provides true &#8220;table-like&#8221; behavior over data files stored in YOUR bucket.</p><p>From a tactical standpoint, it lets you manage and control which provider has access to your data.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-E2I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-E2I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png 424w, https://substackcdn.com/image/fetch/$s_!-E2I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png 848w, https://substackcdn.com/image/fetch/$s_!-E2I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png 1272w, https://substackcdn.com/image/fetch/$s_!-E2I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-E2I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png" width="521" height="282.8719068413392" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:746,&quot;width&quot;:1374,&quot;resizeWidth&quot;:521,&quot;bytes&quot;:171602,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.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_!-E2I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png 424w, https://substackcdn.com/image/fetch/$s_!-E2I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png 848w, https://substackcdn.com/image/fetch/$s_!-E2I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png 1272w, https://substackcdn.com/image/fetch/$s_!-E2I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F408b0d2d-4a29-4f0a-9595-30473da67ff6_1374x746.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This means that by betting on Open Table Formats (OTF), you can choose lightweight, open-source single-node engines to process your data when appropriate.</p><p>Or, if you need to scale for a specific job, you can pick your favorite large-scale engine.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;653c4190-17d2-44a6-88fb-1ef64404948e&quot;,&quot;caption&quot;:&quot;I got triggered by Randy's post last week about adding Lambda-like functionalities in Snowflake via Snowpark.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Using Snowflake as a supercharged Lambda&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-04-24T05:01:13.909Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd505915-8935-4c5d-a0c0-444d14298ddd_1334x686.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/snowflake-is-the-new-lambda&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:143838219,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:8,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>And interestingly, betting on OTF now means supporting the &#8220;in 10 years&#8221; leading compute engine.</p><p>What about the limitations?</p><ul><li><p>JVM oriented</p></li></ul><p>Open Table Formats are still new in terms of adoption and have mostly come from the Big Tech world.</p><p>Because of this, many tools are JVM-based, but support for Python, Rust, and Go is growing fast.</p><ul><li><p>Maintenance</p></li></ul><p>Controlling metadata means you have to do some maintenance to maintain good performance.</p><p>This adds complexity, but more and more managed services (like S3 Tables) handle this for you.</p><ul><li><p>Catalog hosting</p></li></ul><p>Finally, for Iceberg specifically, you need to host a dedicated catalog, which adds another layer of complexity. </p><p>However, providers are offering better and better managed catalog services, or you can go for the <a href="https://github.com/boringdata/boring-catalog">boring-catalog</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6WNt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6WNt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png 424w, https://substackcdn.com/image/fetch/$s_!6WNt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png 848w, https://substackcdn.com/image/fetch/$s_!6WNt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!6WNt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6WNt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png" width="481" height="239.83928571428572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:726,&quot;width&quot;:1456,&quot;resizeWidth&quot;:481,&quot;bytes&quot;:1442328,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.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_!6WNt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png 424w, https://substackcdn.com/image/fetch/$s_!6WNt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png 848w, https://substackcdn.com/image/fetch/$s_!6WNt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!6WNt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca15b-bf62-4382-8a7f-91285f8d7cf6_2006x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><p>But what about AI?</p><p>Can Open Table Formats support AI workloads?</p><p>First, it&#8217;s possible to store vectors inside Parquet files&#8212;and therefore inside Iceberg.</p><p>However, when storing large vectors in Parquet, query performance can degrade.</p><p>More details why here:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;be5a31c0-a466-4cde-9cb4-14240a3bcb3c&quot;,&quot;caption&quot;:&quot;In every data engineer's mind, storing data = Parquet.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Parquet &amp; AI = &#128581;&#8205;&#9794;&#65039;&#9940;&#65039;? &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-06-12T06:03:21.825Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45a9f97a-61f3-4c87-adde-a2ca31c0a08b_1200x1500.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/parquet-and-ai&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:145350618,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:32,&quot;comment_count&quot;:7,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>This is why file formats like <a href="https://lancedb.github.io/lance/">Lance</a> have been created: to store large blobs more efficiently.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zl7t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zl7t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png 424w, https://substackcdn.com/image/fetch/$s_!zl7t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png 848w, https://substackcdn.com/image/fetch/$s_!zl7t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png 1272w, https://substackcdn.com/image/fetch/$s_!zl7t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zl7t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png" width="519" height="378.55631868131866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1062,&quot;width&quot;:1456,&quot;resizeWidth&quot;:519,&quot;bytes&quot;:227958,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.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_!zl7t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png 424w, https://substackcdn.com/image/fetch/$s_!zl7t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png 848w, https://substackcdn.com/image/fetch/$s_!zl7t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.png 1272w, https://substackcdn.com/image/fetch/$s_!zl7t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16be66bd-0a9d-4765-b602-159bf2025634_1620x1182.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>And guess what?</p><p>Lance has recently shared their vision for integrating with Iceberg.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NTwz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NTwz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png 424w, https://substackcdn.com/image/fetch/$s_!NTwz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png 848w, https://substackcdn.com/image/fetch/$s_!NTwz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png 1272w, https://substackcdn.com/image/fetch/$s_!NTwz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NTwz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png" width="553" height="259.02884615384613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:682,&quot;width&quot;:1456,&quot;resizeWidth&quot;:553,&quot;bytes&quot;:2324308,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.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_!NTwz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png 424w, https://substackcdn.com/image/fetch/$s_!NTwz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png 848w, https://substackcdn.com/image/fetch/$s_!NTwz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.png 1272w, https://substackcdn.com/image/fetch/$s_!NTwz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389688d4-87fa-41b9-bbe4-f081a8e69e69_2356x1104.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><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tfe5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tfe5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png 424w, https://substackcdn.com/image/fetch/$s_!tfe5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png 848w, https://substackcdn.com/image/fetch/$s_!tfe5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png 1272w, https://substackcdn.com/image/fetch/$s_!tfe5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tfe5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png" width="543" height="245.2008547008547" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:634,&quot;width&quot;:1404,&quot;resizeWidth&quot;:543,&quot;bytes&quot;:198309,&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://juhache.substack.com/i/165847737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.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_!tfe5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png 424w, https://substackcdn.com/image/fetch/$s_!tfe5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png 848w, https://substackcdn.com/image/fetch/$s_!tfe5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.png 1272w, https://substackcdn.com/image/fetch/$s_!tfe5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5609b-580a-4b41-99ad-053c94eb1b3e_1404x634.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>In the future, depending on the workload, data will be stored in the most suitable format, while metadata will be maintained in a standardized way (OTF)&#8212;allowing any engine to efficiently query all types of data.</p><p></p><p>I find it super interesting that open table formats are rising just as the AI wave shakes the tech world.</p><p>And when European companies are sinking deeper into dependency on US tech platforms.</p><p>Open table formats feel like a lifebelt falling from the sky&#8230;</p><div><hr></div><p>I did another interview this week on this topic with Mehdi from MotherDuck.</p><p>Check it out here:</p><div id="youtube2-iiZNv_xpJTg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;iiZNv_xpJTg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/iiZNv_xpJTg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p>Thanks for reading,</p><p>-Ju</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Boring Iceberg Catalog — 1 JSON file. 0 Setup. ]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 85]]></description><link>https://juhache.substack.com/p/boring-iceberg-catalog</link><guid isPermaLink="false">https://juhache.substack.com/p/boring-iceberg-catalog</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Thu, 22 May 2025 09:01:40 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3e4ab8e8-515d-4bfa-b7e0-2dff89b20f9c_1370x1188.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><blockquote><p>Bonjour!</p><p>I'm Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p></blockquote><p>Snowflake, AWS, Databricks, and GCP all have their own Iceberg catalog implementations&#8230;</p><p>So I needed mine &#128514;.</p><p>Since S3 introduced conditional writes, I&#8217;ve had this idea: use it to build a <em>damn simple</em> Iceberg catalog.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;24dfed98-3c90-47b8-be21-9869d6b61393&quot;,&quot;caption&quot;:&quot;Bonjour!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;RIP Iceberg Catalogs ? &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:35734446,&quot;name&quot;:&quot;Julien Hurault&quot;,&quot;bio&quot;:&quot;https://www.linkedin.com/in/julienhuraultanalytics/&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcd13909-dd93-49c5-97e0-9890b91d2d81_1380x1380.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-09-21T09:01:54.234Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffb3999e-0f96-4842-89df-dc424d6ee1ee_1200x1500.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://juhache.substack.com/p/rip-iceberg-catalogs&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:148444952,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:26,&quot;comment_count&quot;:10,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Ju Data Engineering Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cc8e88-2a37-4b92-8ff9-dae996ed985d_1280x1280.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>No server to set up.</p><p>No REST API.</p><p>No cloud service.</p><p>No config.</p><p>Just one (boring) JSON file &#8212; and a smooth developer experience.</p><p>Let&#8217;s dive into the boring catalog story.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/boringdata/boring-catalog&quot;,&quot;text&quot;:&quot;Github Boring Catalog&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/boringdata/boring-catalog"><span>Github Boring Catalog</span></a></p><blockquote><p>The boring catalog is an experiment and still in its early days. Use with caution.</p><p>This implementation is very basic and doesn&#8217;t cover some enterprise requirements like governance or advanced security.</p><p>The goal is simple: to let people experiment easily with Iceberg&#8217;s commit mechanism and remove some of the usual friction around catalog setup.</p></blockquote><h1>The Boring Catalog</h1><p>Boring catalog is distributed as a Python package:</p><pre><code>uv install boringcatalog</code></pre><p>It is composed of a CLI called &#8220;ice&#8221;: </p><pre><code>ice --help</code></pre><p>and a Python package</p><pre><code>from boringcatalog import BoringCatalog
catalog = BoringCatalog()</code></pre><h2>git init &#8594; ice init</h2><p>Inspired by <a href="https://www.linkedin.com/in/tfmv/">Thomas McGeehan</a>, I took inspiration from the git workflow to design the catalog UX:</p><pre><code>ice init</code></pre><p>This command creates two files:</p><ul><li><p><code>catalog.json</code> &#8212; the actual catalog file (by default, created in a new <code>catalog</code> folder)</p></li><li><p><code>.ice/index</code> &#8212; a small file that stores the path to your catalog, similar to how .git/index works</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FhBx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FhBx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png 424w, https://substackcdn.com/image/fetch/$s_!FhBx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png 848w, https://substackcdn.com/image/fetch/$s_!FhBx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png 1272w, https://substackcdn.com/image/fetch/$s_!FhBx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FhBx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png" width="194" height="126.23923444976077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:272,&quot;width&quot;:418,&quot;resizeWidth&quot;:194,&quot;bytes&quot;:17136,&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://juhache.substack.com/i/163987766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.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_!FhBx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png 424w, https://substackcdn.com/image/fetch/$s_!FhBx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png 848w, https://substackcdn.com/image/fetch/$s_!FhBx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png 1272w, https://substackcdn.com/image/fetch/$s_!FhBx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d3820-b7c9-4d63-b894-b090d0b063c3_418x272.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Of course, you can store your catalog.json anywhere, as long as it&#8217;s a PyArrow <a href="https://arrow.apache.org/docs/python/generated/pyarrow.fs.FileSystem.html">Filesystem</a> or fsspec&#8211;compatible URI:</p><pre><code>... AWS CLI auth ...

ice init --catalog s3://&lt;your-bucket&gt;/catalog.json</code></pre><h2>git commit &#8594; ice commit</h2><p>Okay, our catalog is set up.</p><p>Let&#8217;s write some data to Iceberg.</p><p>First, grab a Parquet file:</p><pre><code>curl https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet -o /tmp/yellow_tripdata_2023-01.parquet</code></pre><p>Then commit it to the catalog:</p><pre><code><code>ice commit my_table --source /tmp/yellow_tripdata_2023-01.parquet</code></code></pre><p>This will automatically create a default namespace and a new table called my_table.</p><p><em>Note: For now, commit only accepts Parquet files as input and appends data to the target table.</em></p><h2>git log &#8594; ice log</h2><p>Iceberg uses a snapshot mechanism &#8212; every operation (like appends or schema changes) is recorded as a distinct snapshot.</p><p>To view the history of operations made to your catalog, run:</p><pre><code><code>ice log</code></code></pre><p>Similar to the <code>git log</code> command, the most recent commit is shown first, along with a summary of the operation:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PdMY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PdMY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png 424w, https://substackcdn.com/image/fetch/$s_!PdMY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png 848w, https://substackcdn.com/image/fetch/$s_!PdMY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png 1272w, https://substackcdn.com/image/fetch/$s_!PdMY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PdMY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png" width="322" height="381.34138972809666" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:662,&quot;resizeWidth&quot;:322,&quot;bytes&quot;:107577,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/163987766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!PdMY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png 424w, https://substackcdn.com/image/fetch/$s_!PdMY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png 848w, https://substackcdn.com/image/fetch/$s_!PdMY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.png 1272w, https://substackcdn.com/image/fetch/$s_!PdMY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380913e0-5e8b-4b23-a9fa-7ba5c468e0b5_662x784.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>Each entry includes metadata such as the snapshot ID, timestamp, operation type (e.g., append), and the number of files or rows involved.</p><h2>Ice Duck: DuckDB shell</h2><p>I personally love using DuckDB for data exploration and quick manipulation.</p><p>If you run:</p><pre><code><code>ice duck</code></code></pre><p>This opens a DuckDB shell with your Iceberg context already loaded.</p><p>You&#8217;ll get:</p><ul><li><p>A table listing all namespaces</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3TIQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3TIQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png 424w, https://substackcdn.com/image/fetch/$s_!3TIQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png 848w, https://substackcdn.com/image/fetch/$s_!3TIQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png 1272w, https://substackcdn.com/image/fetch/$s_!3TIQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3TIQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png" width="334" height="133.17041800643088" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:248,&quot;width&quot;:622,&quot;resizeWidth&quot;:334,&quot;bytes&quot;:26398,&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://juhache.substack.com/i/163987766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.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_!3TIQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png 424w, https://substackcdn.com/image/fetch/$s_!3TIQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png 848w, https://substackcdn.com/image/fetch/$s_!3TIQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png 1272w, https://substackcdn.com/image/fetch/$s_!3TIQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d5671c-18cc-45e3-a012-56ab2213736c_622x248.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p>A table listing all the Iceberg tables</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lyi0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lyi0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png 424w, https://substackcdn.com/image/fetch/$s_!lyi0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png 848w, https://substackcdn.com/image/fetch/$s_!lyi0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png 1272w, https://substackcdn.com/image/fetch/$s_!lyi0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lyi0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png" width="1456" height="168" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:168,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31396,&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://juhache.substack.com/i/163987766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.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_!lyi0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png 424w, https://substackcdn.com/image/fetch/$s_!lyi0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png 848w, https://substackcdn.com/image/fetch/$s_!lyi0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png 1272w, https://substackcdn.com/image/fetch/$s_!lyi0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08babe6b-8353-4d1b-bee1-36b9bce75977_1746x202.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p>Views are automatically created for each Iceberg table, ready to query</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UpZI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UpZI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png 424w, https://substackcdn.com/image/fetch/$s_!UpZI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png 848w, https://substackcdn.com/image/fetch/$s_!UpZI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png 1272w, https://substackcdn.com/image/fetch/$s_!UpZI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UpZI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png" width="1456" height="265" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:265,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60546,&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://juhache.substack.com/i/163987766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.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_!UpZI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png 424w, https://substackcdn.com/image/fetch/$s_!UpZI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png 848w, https://substackcdn.com/image/fetch/$s_!UpZI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png 1272w, https://substackcdn.com/image/fetch/$s_!UpZI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596e6b86-5890-4abe-90e5-40e1689eebbc_1648x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Iceberg tables are accessed via the Iceberg DuckDB extension</figcaption></figure></div></li></ul><p>And of course, for a more visual experience, you can launch the DuckDB web UI with:</p><pre><code>ice duck -ui</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nMxc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nMxc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png 424w, https://substackcdn.com/image/fetch/$s_!nMxc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png 848w, https://substackcdn.com/image/fetch/$s_!nMxc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!nMxc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nMxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png" width="648" height="509.5879120879121" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1145,&quot;width&quot;:1456,&quot;resizeWidth&quot;:648,&quot;bytes&quot;:415123,&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://juhache.substack.com/i/163987766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.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_!nMxc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png 424w, https://substackcdn.com/image/fetch/$s_!nMxc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png 848w, https://substackcdn.com/image/fetch/$s_!nMxc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!nMxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd5ac0f-6c48-4126-82eb-1245d51daeac_2082x1638.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Python Interface</h2><p>As mentioned earlier, you can also interact with the catalog via Python using the boringcatalog library:</p><pre><code>from boringcatalog import BoringCatalog
catalog = BoringCatalog()</code></pre><p>You can then use it just like you would with PyIceberg:</p><pre><code>import pyarrow.parquet as pq

df = pq.read_table("/tmp/yellow_tripdata_2023-01.parquet")

table = catalog.load_table(("ice_default", "my_table"))

table.append(df)</code></pre><h2>Polars Interface</h2><p>Since Polars integrates with PyIceberg, you can also ingest data directly via Polars:</p><pre><code>import polars as pl

df = pl.read_parquet("/tmp/yellow_tripdata_2023-01.parquet")

...

table = catalog.load_table("ice_default.my_table")

df1.write_iceberg(
    target = table,
    mode = "append"
)</code></pre><h1>How does it work?</h1><p>Under the hood, the catalog is simply an instance of the generic Catalog class from the PyIceberg library.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!or18!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!or18!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png 424w, https://substackcdn.com/image/fetch/$s_!or18!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png 848w, https://substackcdn.com/image/fetch/$s_!or18!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png 1272w, https://substackcdn.com/image/fetch/$s_!or18!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!or18!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png" width="494" height="57.11561866125761" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29643dea-db87-4388-a146-de32d059c579_986x114.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:114,&quot;width&quot;:986,&quot;resizeWidth&quot;:494,&quot;bytes&quot;:24677,&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://juhache.substack.com/i/163987766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.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_!or18!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png 424w, https://substackcdn.com/image/fetch/$s_!or18!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png 848w, https://substackcdn.com/image/fetch/$s_!or18!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png 1272w, https://substackcdn.com/image/fetch/$s_!or18!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29643dea-db87-4388-a146-de32d059c579_986x114.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>PyIceberg already provides several catalog implementations out of the box &#8212; Hive, REST, AWS Glue, Nessie, and more.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-Aeh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Aeh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png 424w, https://substackcdn.com/image/fetch/$s_!-Aeh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png 848w, https://substackcdn.com/image/fetch/$s_!-Aeh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png 1272w, https://substackcdn.com/image/fetch/$s_!-Aeh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Aeh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png" width="236" height="281.4750830564784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:602,&quot;resizeWidth&quot;:236,&quot;bytes&quot;:50859,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/163987766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-Aeh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png 424w, https://substackcdn.com/image/fetch/$s_!-Aeh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png 848w, https://substackcdn.com/image/fetch/$s_!-Aeh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png 1272w, https://substackcdn.com/image/fetch/$s_!-Aeh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F398dbf3a-05ed-4a2c-9b50-6515c31757fc_602x718.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Existing PyIceberg catalog implementations </figcaption></figure></div><p>I just adapted a few methods to read from and write to a plain JSON file. </p><p>That&#8217;s it.</p><p>&#9888;&#65039; What About Concurrency?</p><p>Traditional catalog backends use a database or service to coordinate concurrent writes.</p><p>In this implementation, we leverage <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-writes.html">S3 conditional writes</a> to ensure consistency without a separate backend.</p><p>Here&#8217;s how it works:</p><ol><li><p>Fetch the current ETag of the catalog.json file</p></li><li><p>Perform the operations </p></li><li><p>Before committing to the catalog, check if the file ETag has changed</p><ul><li><p>If not, proceed to update the catalog.json file</p></li><li><p>If yes, raise an error</p></li></ul></li></ol><p>It&#8217;s then up to the writer to refresh the catalog and retry the operation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oHfc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oHfc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png 424w, https://substackcdn.com/image/fetch/$s_!oHfc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png 848w, https://substackcdn.com/image/fetch/$s_!oHfc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png 1272w, https://substackcdn.com/image/fetch/$s_!oHfc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oHfc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png" width="463" height="415.34770514603616" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1290,&quot;width&quot;:1438,&quot;resizeWidth&quot;:463,&quot;bytes&quot;:254564,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!oHfc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png 424w, https://substackcdn.com/image/fetch/$s_!oHfc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png 848w, https://substackcdn.com/image/fetch/$s_!oHfc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.png 1272w, https://substackcdn.com/image/fetch/$s_!oHfc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2b6f90-be2e-4e32-a1c8-415f4d4d92d2_1438x1290.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>&#9888;&#65039; What About Governance?</p><p>This will probably be the main complaint about such implementation: there is no control over who can read/write a table (except S3 access control).</p><h1>3- Next Steps</h1><p>I mostly use this catalog to quickly spin up an Iceberg setup and experiment with different behaviors.</p><p>I&#8217;ve noticed that using the ice CLI provides a really smooth and fast experience, especially when sensible defaults are set up, like a default namespace and automatic table creation.</p><p>So, I want to enrich the CLI experience by adding more features for playing with partition specs, merge operations, schema evolution, etc.</p><div><hr></div><p>An interesting next step I&#8217;m considering is to expose a REST catalog interface for the boring catalog, either via the CLI command:</p><pre><code>ice rest </code></pre><p>(or maybe even through a Lambda URL)</p><p>You might wonder: why expose a REST interface?</p><p>Simply because REST catalogs are becoming the standard way Iceberg integrates with other platforms.</p><p>For example, Snowflake supports REST catalogs now:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xaac!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xaac!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png 424w, https://substackcdn.com/image/fetch/$s_!xaac!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png 848w, https://substackcdn.com/image/fetch/$s_!xaac!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png 1272w, https://substackcdn.com/image/fetch/$s_!xaac!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xaac!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png" width="465" height="410.0278164116829" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1268,&quot;width&quot;:1438,&quot;resizeWidth&quot;:465,&quot;bytes&quot;:243761,&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://juhache.substack.com/i/163987766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.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_!xaac!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png 424w, https://substackcdn.com/image/fetch/$s_!xaac!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png 848w, https://substackcdn.com/image/fetch/$s_!xaac!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.png 1272w, https://substackcdn.com/image/fetch/$s_!xaac!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98711e2e-aaf9-49d8-a29c-4b63a28be471_1438x1268.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>So, a possible next step would be to enable writing directly from Snowflake in the boring catalog.<br></p><div><hr></div><p>If you like the project, please consider giving the <a href="https://github.com/boringdata/boring-catalog">GitHub repo</a> a star.</p><p>And don&#8217;t hesitate to comment on this article or reply to this email and tell me what you think about it: stupid, interesting, or anything else. </p><p>I&#8217;d love your honest feedback.</p><div><hr></div><p>Building a data stack is complex&#8212;too many moving pieces, too little time.</p><p>That&#8217;s where <strong>Boring Data</strong> comes in.</p><p>I&#8217;ve created a data stack onboarding package combining ready-to-use templates and hands-on workshops.</p><p>Interested?</p><p>Check out <a href="https://www.boringdata.io">boringdata.io</a> or reply to this email&#8212;I&#8217;d be happy to walk you through our templates and workshops.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KsvP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KsvP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 424w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 848w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 1272w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KsvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png" width="404" height="281.90831918505944" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:1178,&quot;resizeWidth&quot;:404,&quot;bytes&quot;:270843,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!KsvP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 424w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 848w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 1272w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://boringdata.io&quot;,&quot;text&quot;:&quot;boringdata.io&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://boringdata.io"><span>boringdata.io</span></a></p><div><hr></div><p>Thanks for reading,</p><p>-Ju</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[From DuckDB to DuckHouse]]></title><description><![CDATA[Ju Data Engineering Weekly - Ep 84]]></description><link>https://juhache.substack.com/p/from-duckdb-to-duckhouse</link><guid isPermaLink="false">https://juhache.substack.com/p/from-duckdb-to-duckhouse</guid><dc:creator><![CDATA[Julien Hurault]]></dc:creator><pubDate>Fri, 09 May 2025 08:23:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f29a2e1f-8352-482f-900d-7bc77ad8932a_1000x700.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Bonjour!</p><p>I'm Julien, freelance data engineer based in Geneva &#127464;&#127469;.</p><p>Every week, I research and share ideas about the data engineering craft.</p><p>Not subscribed yet?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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"><code>&#128104;&#127997;&#8205;&#128187; echo {YOUR_INBOX} &gt;&gt;</code></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p></blockquote><p><a href="https://duckdb.org/">DuckDB</a> has become well-known as a lightweight, portable, and fast OLAP database.</p><p>I've primarily seen it used for local testing and stateless computations.</p><p>While it excels as an embedded engine, could we push its boundaries further?</p><p>Could we build an actual data platform centered around DuckDB?</p><p>This post, written with <a href="https://www.linkedin.com/in/hussainsultan/">Hussain</a>, explores how to build such a stack and transform your DuckDB into a DuckHouse.</p><p>&#8212;</p><p><em>You can find the source code of this project <a href="https://github.com/boringdata/duckhouse">here</a>. </em></p><p><em>Note: This project is an exploration and is not production-ready.</em></p><h1>Design</h1><p>Here are the requirements for our DuckHouse:</p><ul><li><p>We must support concurrent writers because we need multiple ETL jobs running simultaneously. This would also enable a single DuckHouse instance to support a multi-tenant setup.</p></li><li><p>Allow multiple concurrent readers to access data</p></li><li><p>The storage format must handle both small and large tables efficiently</p></li><li><p>Support seamless integration with dbt</p></li></ul><p>Out of scope:</p><ul><li><p>Governance and read/write limitations across users.</p></li></ul><p>&#8212;</p><p>To address these requirements, we implemented a hybrid storage design:</p><ul><li><p>Small tables are stored in .duckdb format directly on S3</p><p>&#8594; e.g., s3://&lt;bucket&gt;/duckhouse.duckdb</p></li><li><p>Large tables (like events) are stored in Iceberg format on S3</p><p>&#8594; e.g., s3://&lt;bucket&gt;/&lt;table&gt;/</p></li></ul><p>This setup provides DuckDB's simplicity and performance for light workloads while scaling with Iceberg for heavy datasets.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pghE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pghE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png 424w, https://substackcdn.com/image/fetch/$s_!pghE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png 848w, https://substackcdn.com/image/fetch/$s_!pghE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png 1272w, https://substackcdn.com/image/fetch/$s_!pghE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pghE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png" width="643" height="617.6184210526316" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1022,&quot;width&quot;:1064,&quot;resizeWidth&quot;:643,&quot;bytes&quot;:141417,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.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_!pghE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png 424w, https://substackcdn.com/image/fetch/$s_!pghE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png 848w, https://substackcdn.com/image/fetch/$s_!pghE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png 1272w, https://substackcdn.com/image/fetch/$s_!pghE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3655b10e-f915-4c39-87d8-b22ce2215725_1064x1022.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Duckhouse Architecture</figcaption></figure></div><p>Let&#8217;s dive in! </p><h1>1. Arrow Flight</h1><p><em>TL;DR</em></p><p><em>We implement an Arrow Flight server as a gateway to our DuckDB storage, solving write concurrency challenges.</em></p><div><hr></div><h3>DuckDB and Write Concurrency</h3><p>Writing concurrency is likely the first challenge you&#8217;ll encounter on this journey.</p><p>DuckDB isn&#8217;t built to handle concurrent writes automatically&#8212;it only allows one writer at a time.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AV9n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AV9n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png 424w, https://substackcdn.com/image/fetch/$s_!AV9n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png 848w, https://substackcdn.com/image/fetch/$s_!AV9n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png 1272w, https://substackcdn.com/image/fetch/$s_!AV9n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AV9n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png" width="1456" height="229" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:229,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:115110,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.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_!AV9n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png 424w, https://substackcdn.com/image/fetch/$s_!AV9n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png 848w, https://substackcdn.com/image/fetch/$s_!AV9n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png 1272w, https://substackcdn.com/image/fetch/$s_!AV9n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2e45679-83eb-4eb3-921c-c5a0487f0115_1526x240.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><a href="https://duckdb.org/docs/stable/connect/concurrency.html#handling-concurrency">source</a></figcaption></figure></div><p>An external component must handle the concurrency control.</p><p>This is where Arrow Flight comes into play.</p><h3>Arrow Flight Server</h3><p>Arrow Flight is a modern alternative to REST APIs for data transfer.</p><p>It enables fast and efficient transfer of large datasets across systems using the Arrow format.</p><p>Traditional data systems require multiple conversion steps:</p><ol><li><p>Server converts data to JSON/CSV</p></li><li><p>Data travels over the network</p></li><li><p>Client converts back to DataFrame</p></li></ol><p>With Arrow Flight, data stays in Arrow format end-to-end, eliminating the need for conversion.</p><p>To solve our concurrency problem, we'll use a Flight server as a gateway for all write operations.</p><p>This server queues write requests and processes them sequentially to avoid any locks.</p><h3>Xorq</h3><p><a href="https://github.com/xorq-labs/xorq">Xorq</a> is a declarative framework for building multi-engine computations in Python.</p><p>They provide a ready-to-run flight server that can be easily connected. </p><p>Running a flight server becomes as easy as:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zoIL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zoIL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png 424w, https://substackcdn.com/image/fetch/$s_!zoIL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png 848w, https://substackcdn.com/image/fetch/$s_!zoIL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!zoIL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zoIL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png" width="542" height="257.97115384615387" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:693,&quot;width&quot;:1456,&quot;resizeWidth&quot;:542,&quot;bytes&quot;:158186,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.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_!zoIL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png 424w, https://substackcdn.com/image/fetch/$s_!zoIL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png 848w, https://substackcdn.com/image/fetch/$s_!zoIL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!zoIL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471d6b73-56a4-4b17-ac23-791a48d64829_2100x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Flight Server with an Iceberg backend</figcaption></figure></div><p>The server supports SQL and Ibis expressions and provides pre-implemented methods across several backends (DuckDB, Iceberg, Snowflake, Trino, etc): create_table, list_tables, get_schema, and upload_data.</p><p>Here&#8217;s how to upload data, for example, to a server:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JOSV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JOSV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png 424w, https://substackcdn.com/image/fetch/$s_!JOSV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png 848w, https://substackcdn.com/image/fetch/$s_!JOSV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png 1272w, https://substackcdn.com/image/fetch/$s_!JOSV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JOSV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png" width="595" height="265.625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:650,&quot;width&quot;:1456,&quot;resizeWidth&quot;:595,&quot;bytes&quot;:177568,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.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_!JOSV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png 424w, https://substackcdn.com/image/fetch/$s_!JOSV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png 848w, https://substackcdn.com/image/fetch/$s_!JOSV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png 1272w, https://substackcdn.com/image/fetch/$s_!JOSV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c64b08-fdc2-4bf5-8cc5-148bebe08870_2644x1180.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Client uploading data to the Flight Server</figcaption></figure></div><p>As mentioned in DuckHouse's requirements above, we need to support writing to either a DuckDB instance or Iceberg for data persistence.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_cJ5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_cJ5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png 424w, https://substackcdn.com/image/fetch/$s_!_cJ5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png 848w, https://substackcdn.com/image/fetch/$s_!_cJ5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png 1272w, https://substackcdn.com/image/fetch/$s_!_cJ5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_cJ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png" width="475" height="494.4539249146758" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1220,&quot;width&quot;:1172,&quot;resizeWidth&quot;:475,&quot;bytes&quot;:382853,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_cJ5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png 424w, https://substackcdn.com/image/fetch/$s_!_cJ5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png 848w, https://substackcdn.com/image/fetch/$s_!_cJ5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png 1272w, https://substackcdn.com/image/fetch/$s_!_cJ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42a69072-d17b-47a6-b228-727a9bdf50d6_1172x1220.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This means we work with two backends: DuckDB and Iceberg.</p><p>We built for this PoC a custom backend on top of Xorq's native Pyiceberg and DuckDB backends:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OnPl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OnPl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png 424w, https://substackcdn.com/image/fetch/$s_!OnPl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png 848w, https://substackcdn.com/image/fetch/$s_!OnPl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png 1272w, https://substackcdn.com/image/fetch/$s_!OnPl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OnPl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png" width="697" height="880.345467032967" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1839,&quot;width&quot;:1456,&quot;resizeWidth&quot;:697,&quot;bytes&quot;:533233,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.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_!OnPl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png 424w, https://substackcdn.com/image/fetch/$s_!OnPl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png 848w, https://substackcdn.com/image/fetch/$s_!OnPl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png 1272w, https://substackcdn.com/image/fetch/$s_!OnPl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3ae9bb-b904-405c-ae33-2b3618036e8e_2860x3612.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Custom Backend for this PoC</figcaption></figure></div><p>The Flight server writes data to either backend based on the user-provided target parameter.</p><p>Additionaly, to maintain <code>s3://duckhouse.duckdb</code> as a single read entry point, whenever we write to an Iceberg table, we create (or replace) a DuckDB view that points to its latest snapshot.</p><h1>2. Writing to the Duckhouse</h1><p><em>TL;DR:</em></p><ul><li><p><em>Data ingestion via the Flight server directly</em></p></li><li><p><em>Data transformation via dbt and a custom duckdb-dbt plugin</em></p></li></ul><div><hr></div><p>Let's examine how we interact with the Duckhouse for our two write use cases: data ingestion and transformation.</p><ul><li><p>Data Ingestion</p></li></ul><p>The most straightforward way to write to our new warehouse is to call the Flight server directly, as shown above.</p><p>This method serves as our primary approach for data ingestion.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AO7x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AO7x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png 424w, https://substackcdn.com/image/fetch/$s_!AO7x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png 848w, https://substackcdn.com/image/fetch/$s_!AO7x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png 1272w, https://substackcdn.com/image/fetch/$s_!AO7x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AO7x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png" width="632" height="285.18131868131866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:657,&quot;width&quot;:1456,&quot;resizeWidth&quot;:632,&quot;bytes&quot;:240974,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.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_!AO7x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png 424w, https://substackcdn.com/image/fetch/$s_!AO7x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png 848w, https://substackcdn.com/image/fetch/$s_!AO7x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.png 1272w, https://substackcdn.com/image/fetch/$s_!AO7x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9491b1ac-f9c5-4e84-b1dc-84acfd1ee506_3012x1360.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><ul><li><p>Data Transformation</p></li></ul><p>Once data is ingested, we run transformations using dbt.</p><p>For this, we use the powerful dbt-duckdb extension.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e2zK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e2zK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png 424w, https://substackcdn.com/image/fetch/$s_!e2zK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png 848w, https://substackcdn.com/image/fetch/$s_!e2zK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png 1272w, https://substackcdn.com/image/fetch/$s_!e2zK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e2zK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png" width="582" height="272.7085714285714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:492,&quot;width&quot;:1050,&quot;resizeWidth&quot;:582,&quot;bytes&quot;:239854,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.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_!e2zK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png 424w, https://substackcdn.com/image/fetch/$s_!e2zK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png 848w, https://substackcdn.com/image/fetch/$s_!e2zK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png 1272w, https://substackcdn.com/image/fetch/$s_!e2zK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1cb13d3-2bf3-4e84-9fc3-caa26ec65481_1050x492.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This extension runs your dbt project pipeline against an in-memory DuckDB database that won't persist after your run is complete.</p><p>It provides a super powerful plugin <a href="https://github.com/duckdb/dbt-duckdb?tab=readme-ov-file#configuring-dbt-duckdb-plugins">system</a>, which allows you to enhance dbt and provide custom model read/write behaviors:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LWjD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LWjD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png 424w, https://substackcdn.com/image/fetch/$s_!LWjD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png 848w, https://substackcdn.com/image/fetch/$s_!LWjD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png 1272w, https://substackcdn.com/image/fetch/$s_!LWjD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LWjD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png" width="582" height="163.6875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a355da92-8342-451a-9518-9faf21c81658_1408x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:396,&quot;width&quot;:1408,&quot;resizeWidth&quot;:582,&quot;bytes&quot;:268822,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.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_!LWjD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png 424w, https://substackcdn.com/image/fetch/$s_!LWjD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png 848w, https://substackcdn.com/image/fetch/$s_!LWjD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png 1272w, https://substackcdn.com/image/fetch/$s_!LWjD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa355da92-8342-451a-9518-9faf21c81658_1408x396.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>A dbt-duckdb plugin is a simple class that implements these four methods:</p><ul><li><p><code>initialize</code></p></li><li><p><code>configure_connection</code></p></li><li><p><code>load</code>: used to load the sources of a dbt model</p></li><li><p><code>store</code>: used to persist a dbt model</p></li></ul><p>Our plugin forwards the dbt read/write calls of each model to our flight server:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yrc3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yrc3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png 424w, https://substackcdn.com/image/fetch/$s_!Yrc3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png 848w, https://substackcdn.com/image/fetch/$s_!Yrc3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png 1272w, https://substackcdn.com/image/fetch/$s_!Yrc3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yrc3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png" width="648" height="784.6318681318681" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/432224f0-1680-4f52-a962-638e76679523_3204x3880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1763,&quot;width&quot;:1456,&quot;resizeWidth&quot;:648,&quot;bytes&quot;:866062,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.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_!Yrc3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png 424w, https://substackcdn.com/image/fetch/$s_!Yrc3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png 848w, https://substackcdn.com/image/fetch/$s_!Yrc3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png 1272w, https://substackcdn.com/image/fetch/$s_!Yrc3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432224f0-1680-4f52-a962-638e76679523_3204x3880.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Our dbt-duckdb plugin</figcaption></figure></div><p>A dbt model looks like the following:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hanf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hanf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png 424w, https://substackcdn.com/image/fetch/$s_!hanf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png 848w, https://substackcdn.com/image/fetch/$s_!hanf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png 1272w, https://substackcdn.com/image/fetch/$s_!hanf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hanf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png" width="466" height="244.52197802197801" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:466,&quot;bytes&quot;:124226,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.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_!hanf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png 424w, https://substackcdn.com/image/fetch/$s_!hanf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png 848w, https://substackcdn.com/image/fetch/$s_!hanf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png 1272w, https://substackcdn.com/image/fetch/$s_!hanf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d989d67-3e07-4223-8571-5f3afe1aac73_2080x1092.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">dbt model interfaced with our Flight server</figcaption></figure></div><p>Depending on the model&#8217;s config, it can be persisted in any of these locations:</p><ul><li><p><code>materialized="external"</code></p><p><code>target = "iceberg"</code> </p><p>&#8658; Model written to Iceberg <code>s3://duckhouse/my_table/</code></p><p></p></li><li><p><code>materialized="external"</code></p><p> <code>target = "duckdb"</code> </p><p>&#8658; Model written to our duckhouse <code>s3://duckhouse.duckdb</code></p><p></p></li><li><p><code>materialized="table"</code> </p><p>&#8658; Model written to the temporary in-memory DuckDB instance used by dbt</p></li></ul><h1>Reading from the Duckhouse</h1><p>The read path is much simpler: you need to expose the<code> duckhouse.duckdb</code> file to your users.</p><p>They then need to open a DuckDB shell and run:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K3je!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K3je!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png 424w, https://substackcdn.com/image/fetch/$s_!K3je!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png 848w, https://substackcdn.com/image/fetch/$s_!K3je!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png 1272w, https://substackcdn.com/image/fetch/$s_!K3je!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K3je!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png" width="482" height="106.59615384615384" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:322,&quot;width&quot;:1456,&quot;resizeWidth&quot;:482,&quot;bytes&quot;:56426,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.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_!K3je!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png 424w, https://substackcdn.com/image/fetch/$s_!K3je!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png 848w, https://substackcdn.com/image/fetch/$s_!K3je!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png 1272w, https://substackcdn.com/image/fetch/$s_!K3je!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1928a07-51be-4e48-852a-88b0ab548dc4_2080x460.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">ATTACH &#10084;&#65039;</figcaption></figure></div><p>That's it!</p><p>Users can access both tables stored in <code>s3://duckhouse.duckdb</code> (tables) and Iceberg tables (via views).</p><p>The system is fully decentralized&#8212;users can query data and run computations on their machine.</p><p>Users can also directly access the flight service and use Xorq to perform computations if needed:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VkUz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VkUz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png 424w, https://substackcdn.com/image/fetch/$s_!VkUz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png 848w, https://substackcdn.com/image/fetch/$s_!VkUz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png 1272w, https://substackcdn.com/image/fetch/$s_!VkUz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VkUz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png" width="1456" height="548" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:548,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:315668,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.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_!VkUz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png 424w, https://substackcdn.com/image/fetch/$s_!VkUz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png 848w, https://substackcdn.com/image/fetch/$s_!VkUz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.png 1272w, https://substackcdn.com/image/fetch/$s_!VkUz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a69801d-c0cf-4e72-b935-09c659d68b48_3612x1360.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><h1>Example Pipeline</h1><p>Let's look at an example pipeline.</p><p>First, we'll use an ingestion script to write taxi data to a landing table in Iceberg:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zXwm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zXwm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png 424w, https://substackcdn.com/image/fetch/$s_!zXwm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png 848w, https://substackcdn.com/image/fetch/$s_!zXwm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png 1272w, https://substackcdn.com/image/fetch/$s_!zXwm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zXwm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png" width="612" height="253.03846153846155" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:602,&quot;width&quot;:1456,&quot;resizeWidth&quot;:612,&quot;bytes&quot;:250036,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.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_!zXwm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png 424w, https://substackcdn.com/image/fetch/$s_!zXwm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png 848w, https://substackcdn.com/image/fetch/$s_!zXwm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png 1272w, https://substackcdn.com/image/fetch/$s_!zXwm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed4e97e1-6528-4ef6-8028-5a0134173965_3076x1272.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">ingestion.py</figcaption></figure></div><p>We can then check the data in the Duckhouse via a DuckDB shell:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kXzE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kXzE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png 424w, https://substackcdn.com/image/fetch/$s_!kXzE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png 848w, https://substackcdn.com/image/fetch/$s_!kXzE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png 1272w, https://substackcdn.com/image/fetch/$s_!kXzE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kXzE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png" width="392" height="256.4065573770492" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:798,&quot;width&quot;:1220,&quot;resizeWidth&quot;:392,&quot;bytes&quot;:242659,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.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_!kXzE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png 424w, https://substackcdn.com/image/fetch/$s_!kXzE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png 848w, https://substackcdn.com/image/fetch/$s_!kXzE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png 1272w, https://substackcdn.com/image/fetch/$s_!kXzE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc877a0cd-7572-436d-81d6-fc7a694457e6_1220x798.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Taxi landing table</figcaption></figure></div><p>Let&#8217;s create duplicates by rerunning the ingestion; we now have 6.133.532 rows.</p><p>We then create a simple dbt DAG:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qYv8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qYv8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png 424w, https://substackcdn.com/image/fetch/$s_!qYv8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png 848w, https://substackcdn.com/image/fetch/$s_!qYv8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png 1272w, https://substackcdn.com/image/fetch/$s_!qYv8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qYv8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png" width="283" height="156.06617647058823" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:816,&quot;resizeWidth&quot;:283,&quot;bytes&quot;:91495,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.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_!qYv8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png 424w, https://substackcdn.com/image/fetch/$s_!qYv8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png 848w, https://substackcdn.com/image/fetch/$s_!qYv8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png 1272w, https://substackcdn.com/image/fetch/$s_!qYv8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6d759d4-6088-4f6c-980e-6e41fd31a55f_816x450.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">dbt DAG</figcaption></figure></div><p>The sources.yml points to the landing table we have just created:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HDt1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HDt1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png 424w, https://substackcdn.com/image/fetch/$s_!HDt1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png 848w, https://substackcdn.com/image/fetch/$s_!HDt1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png 1272w, https://substackcdn.com/image/fetch/$s_!HDt1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HDt1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png" width="456" height="199.8131868131868" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:638,&quot;width&quot;:1456,&quot;resizeWidth&quot;:456,&quot;bytes&quot;:116997,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.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_!HDt1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png 424w, https://substackcdn.com/image/fetch/$s_!HDt1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png 848w, https://substackcdn.com/image/fetch/$s_!HDt1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png 1272w, https://substackcdn.com/image/fetch/$s_!HDt1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4772172-0d94-45ab-84f9-0f8521cc004f_2080x912.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">source.yml</figcaption></figure></div><p>We then have a first dbt staging model simply deduplicating the rows for the landing table:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!95k6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!95k6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png 424w, https://substackcdn.com/image/fetch/$s_!95k6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png 848w, https://substackcdn.com/image/fetch/$s_!95k6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png 1272w, https://substackcdn.com/image/fetch/$s_!95k6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!95k6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png" width="583" height="336.34615384615387" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:840,&quot;width&quot;:1456,&quot;resizeWidth&quot;:583,&quot;bytes&quot;:228405,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.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_!95k6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png 424w, https://substackcdn.com/image/fetch/$s_!95k6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png 848w, https://substackcdn.com/image/fetch/$s_!95k6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png 1272w, https://substackcdn.com/image/fetch/$s_!95k6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffb9d95-e287-412e-869c-2301ffb6d2f7_2668x1540.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">taxi_staging.sql</figcaption></figure></div><p>This model is stored in Iceberg.</p><p>A third model computes a simple metric stored in DuckDB:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iWhx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iWhx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png 424w, https://substackcdn.com/image/fetch/$s_!iWhx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png 848w, https://substackcdn.com/image/fetch/$s_!iWhx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png 1272w, https://substackcdn.com/image/fetch/$s_!iWhx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iWhx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png" width="516" height="315.4120879120879" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:890,&quot;width&quot;:1456,&quot;resizeWidth&quot;:516,&quot;bytes&quot;:175923,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.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_!iWhx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png 424w, https://substackcdn.com/image/fetch/$s_!iWhx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png 848w, https://substackcdn.com/image/fetch/$s_!iWhx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png 1272w, https://substackcdn.com/image/fetch/$s_!iWhx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcedccbfb-6e0d-4273-902a-0cf62ecdd5fe_2080x1272.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">taxi_metric.sql</figcaption></figure></div><p>We run <code>dbt run</code>:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yEkq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yEkq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png 424w, https://substackcdn.com/image/fetch/$s_!yEkq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png 848w, https://substackcdn.com/image/fetch/$s_!yEkq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png 1272w, https://substackcdn.com/image/fetch/$s_!yEkq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yEkq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png" width="618" height="113.79047619047618" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:232,&quot;width&quot;:1260,&quot;resizeWidth&quot;:618,&quot;bytes&quot;:92562,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.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_!yEkq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png 424w, https://substackcdn.com/image/fetch/$s_!yEkq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png 848w, https://substackcdn.com/image/fetch/$s_!yEkq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png 1272w, https://substackcdn.com/image/fetch/$s_!yEkq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7185d13a-62a0-4b0c-904a-5fd8419c2c55_1260x232.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And that&#8217;s it !</p><p>We only need to run <code>duckdb duckhouse</code> and we have access to the 3 tables:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d53G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d53G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png 424w, https://substackcdn.com/image/fetch/$s_!d53G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png 848w, https://substackcdn.com/image/fetch/$s_!d53G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png 1272w, https://substackcdn.com/image/fetch/$s_!d53G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d53G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png" width="446" height="308.41645244215937" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:538,&quot;width&quot;:778,&quot;resizeWidth&quot;:446,&quot;bytes&quot;:155228,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.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_!d53G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png 424w, https://substackcdn.com/image/fetch/$s_!d53G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png 848w, https://substackcdn.com/image/fetch/$s_!d53G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png 1272w, https://substackcdn.com/image/fetch/$s_!d53G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c8c649-1395-479f-8dd5-ac5fab8dbaf4_778x538.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">All tables and views stored in Duckhouse</figcaption></figure></div><p>We can query the staging table in Iceberg:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zWeM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zWeM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png 424w, https://substackcdn.com/image/fetch/$s_!zWeM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png 848w, https://substackcdn.com/image/fetch/$s_!zWeM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png 1272w, https://substackcdn.com/image/fetch/$s_!zWeM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zWeM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png" width="364" height="185.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:342,&quot;width&quot;:672,&quot;resizeWidth&quot;:364,&quot;bytes&quot;:58120,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.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_!zWeM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png 424w, https://substackcdn.com/image/fetch/$s_!zWeM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png 848w, https://substackcdn.com/image/fetch/$s_!zWeM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png 1272w, https://substackcdn.com/image/fetch/$s_!zWeM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2c1e41-7d04-4c14-9369-e26c2cc66278_672x342.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Staging table deduplicating records of the landing table</figcaption></figure></div><p>And finally, query the metric in DuckDB:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RHvm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RHvm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png 424w, https://substackcdn.com/image/fetch/$s_!RHvm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png 848w, https://substackcdn.com/image/fetch/$s_!RHvm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png 1272w, https://substackcdn.com/image/fetch/$s_!RHvm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RHvm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png" width="298" height="160.61694915254236" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:318,&quot;width&quot;:590,&quot;resizeWidth&quot;:298,&quot;bytes&quot;:62124,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.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_!RHvm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png 424w, https://substackcdn.com/image/fetch/$s_!RHvm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png 848w, https://substackcdn.com/image/fetch/$s_!RHvm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png 1272w, https://substackcdn.com/image/fetch/$s_!RHvm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb29c2f50-c0e4-41d0-bb08-b6d433574f79_590x318.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Metric table persisted in DuckDB</figcaption></figure></div><h2>Next Steps</h2><p>I love this combination of Flight server, DuckDB, and Iceberg.</p><p>It&#8217;s a perfect compromise:</p><ul><li><p><strong>Light</strong> &#8211; requires only a single Flight server</p></li><li><p><strong>Cheap</strong> &#8211; compute with DuckDB and 100% S3-based storage</p></li><li><p><strong>Scalable</strong> &#8211; large tables live in Iceberg - any engine can process them</p></li></ul><p>Several features remain to be implemented:</p><ul><li><p>Flight server: </p><ul><li><p>Add incremental read/write operations</p></li><li><p>Add MERGE support (currently append-only)</p></li><li><p>Handle table migration when the target changes</p></li></ul></li><li><p>Iceberg: </p><ul><li><p>Integrate with a proper catalog (currently using SQLite)</p></li><li><p>Enable partitioning and clustering configuration in dbt models</p></li></ul></li></ul><p>Additionally, we plan to leverage the Flight server to leverage interfaces with additional backends such as Snowflake, BigQuery, and PostgreSQL.</p><div><hr></div><p>Building a data stack is complex&#8212;too many moving pieces, too little time.</p><p>That&#8217;s where <strong>Boring Data</strong> comes in.</p><p>I&#8217;ve created a data stack onboarding package combining ready-to-use templates and hands-on workshops.</p><p>Interested?</p><p>Check out <a href="https://www.boringdata.io">boringdata.io</a> or reply to this email&#8212;I&#8217;d be happy to walk you through our templates and workshops.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KsvP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KsvP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 424w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 848w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 1272w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KsvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png" width="404" height="281.90831918505944" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:1178,&quot;resizeWidth&quot;:404,&quot;bytes&quot;:270843,&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://juhache.substack.com/i/162034752?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.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_!KsvP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 424w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 848w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.png 1272w, https://substackcdn.com/image/fetch/$s_!KsvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb40c34e0-b830-4dd9-9320-4a7620c01f70_1178x822.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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://boringdata.io&quot;,&quot;text&quot;:&quot;boringdata.io&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://boringdata.io"><span>boringdata.io</span></a></p><div><hr></div><p>Thanks for reading, and thanks, Hussain, for the very nice collaboration.</p><p>-Ju</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RKXu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png" width="170" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:300,&quot;resizeWidth&quot;:170,&quot;bytes&quot;:118353,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RKXu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 424w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 848w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1272w, https://substackcdn.com/image/fetch/$s_!RKXu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b337d0-6c9a-4476-8eef-127b3abd5485_300x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juhache.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 Ju Data Engineering Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>