<?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[Critical! Systems]]></title><description><![CDATA[Technical essays, conversations, and videos from a junior data engineer learning to build and maintain critical systems and data pipelines.]]></description><link>https://criticalsystems.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!xn4q!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb89fbdd9-b97e-4b95-b6e1-251a8b7c880a_500x500.png</url><title>Critical! Systems</title><link>https://criticalsystems.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 31 May 2026 14:58:46 GMT</lastBuildDate><atom:link href="https://criticalsystems.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Sammy Hansali]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[criticalsystems@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[criticalsystems@substack.com]]></itunes:email><itunes:name><![CDATA[Sammy]]></itunes:name></itunes:owner><itunes:author><![CDATA[Sammy]]></itunes:author><googleplay:owner><![CDATA[criticalsystems@substack.com]]></googleplay:owner><googleplay:email><![CDATA[criticalsystems@substack.com]]></googleplay:email><googleplay:author><![CDATA[Sammy]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Exploring AI for Diagramming Technical Architecture]]></title><description><![CDATA[My experience with AI versus manual options]]></description><link>https://criticalsystems.substack.com/p/exploring-ai-for-diagramming-technical</link><guid isPermaLink="false">https://criticalsystems.substack.com/p/exploring-ai-for-diagramming-technical</guid><dc:creator><![CDATA[Sammy]]></dc:creator><pubDate>Sun, 22 Mar 2026 22:12:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!raSS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For my last essay, <a href="https://criticalsystems.substack.com/p/the-core-aws-services-to-know-for?r=5ojrp">The Core AWS Services To Know For Data Engineers</a>, I spent a decent chunk of time creating an architecture diagram for a typical data lake platform in AWS. I used a popular, completely free tool called draw.io. I was pretty darn happy with how it came out. But I was wondering if there was an AI tool out there that was decent for this use case. Below are the results I got from trying out once such tool, <a href="https://www.eraser.io/">Eraser.io</a> and below that is the reference diagram I was trying to recreate.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!raSS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!raSS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png 424w, https://substackcdn.com/image/fetch/$s_!raSS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png 848w, https://substackcdn.com/image/fetch/$s_!raSS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png 1272w, https://substackcdn.com/image/fetch/$s_!raSS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!raSS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png" width="1314" height="930" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1314,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:268041,&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://criticalsystems.substack.com/i/191712111?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f9a1438-46b8-43d7-911a-279a4a2e8ea3_1314x1024.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_!raSS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png 424w, https://substackcdn.com/image/fetch/$s_!raSS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png 848w, https://substackcdn.com/image/fetch/$s_!raSS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.png 1272w, https://substackcdn.com/image/fetch/$s_!raSS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e550689-ab2a-41d3-9099-2a105c4efd63_1314x930.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">Created with Eraser.io (SaaS, AI)</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_!FcOd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FcOd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png 424w, https://substackcdn.com/image/fetch/$s_!FcOd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png 848w, https://substackcdn.com/image/fetch/$s_!FcOd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png 1272w, https://substackcdn.com/image/fetch/$s_!FcOd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FcOd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png" width="1231" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1231,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:199977,&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://criticalsystems.substack.com/i/191712111?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.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_!FcOd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png 424w, https://substackcdn.com/image/fetch/$s_!FcOd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png 848w, https://substackcdn.com/image/fetch/$s_!FcOd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.png 1272w, https://substackcdn.com/image/fetch/$s_!FcOd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95d87f08-a611-4168-b5e9-13ead9d1c960_1231x680.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><figcaption class="image-caption">Created with draw.io (free, manual)</figcaption></figure></div><h2>My experience</h2><p>While I only tried out the one AI tool, my experience with it was positive. It took maybe 20 minutes to create that diagram in total. I gave it a prompt, it generated a decent diagram on the first shot, then I followed it up with 2 rounds of edits via prompts and a final round of manual edits.</p><p>At the end of the day, while I do quite prefer how my manually created diagrams come out in terms of style and feel (and the fact that I can reuse components I&#8217;ve made before for new diagrams), I would definitely try AI diagramming again.</p>]]></content:encoded></item><item><title><![CDATA[The Core AWS Services To Know For Data Engineers]]></title><description><![CDATA[Broken down by ingestion, processing, storage, consumption, and orchestration]]></description><link>https://criticalsystems.substack.com/p/the-core-aws-services-to-know-for</link><guid isPermaLink="false">https://criticalsystems.substack.com/p/the-core-aws-services-to-know-for</guid><dc:creator><![CDATA[Sammy]]></dc:creator><pubDate>Sat, 21 Mar 2026 21:12:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DRtJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AWS was super daunting for me one year ago. It has over 240 standalone services, with each having tons of documentation and learning resources. In this essay, I will try to summarize the core AWS services that are used by data engineers for each component of a typical data lake platform.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DRtJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DRtJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png 424w, https://substackcdn.com/image/fetch/$s_!DRtJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png 848w, https://substackcdn.com/image/fetch/$s_!DRtJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png 1272w, https://substackcdn.com/image/fetch/$s_!DRtJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DRtJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png" width="1231" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1231,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:199977,&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://criticalsystems.substack.com/i/191706431?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.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_!DRtJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png 424w, https://substackcdn.com/image/fetch/$s_!DRtJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png 848w, https://substackcdn.com/image/fetch/$s_!DRtJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png 1272w, https://substackcdn.com/image/fetch/$s_!DRtJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325a5513-5b70-4e88-a7ba-dd4b3aa4dafc_1231x680.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Ingestion</h3><p>Starting with ingestion, you have a couple different options depending on the type of data source you want to ingest. If you are ingesting from some sort of database (such as an on-prem DB, an AWS Relational Database Service DB, or an AWS Dynamo DB), you will most likely use AWS Database Migration Service (DMS). As the name implies, you can migrate (copy over) a database from one database engine to another. You can also use DMS to set up Change Data Capture (CDC) between your source and target. The target for ingestion is usually a raw / landing zone bucket in S3. Some more options from ingesting from a DB is Glue and EMR.</p><p>Another popular ingestion source are SaaS tools (such as from your crm, finance, and operations tools), for which you will use AWS AppFlow for. Finally, when it comes to streaming data sources (like IoT, sensors, and data for real time analytics), you have options ranging from micro-batch (AWS Firehose) to true streaming (AWS Data Streams) to managed kafka (AWS MSK), just to name a few.</p><h3>Lake &amp; Processing</h3><p>The data lake is where most of your data ends up. Typically all of your raw, unprocessed data will get ingested into a bucket designated as the landing zone. From there you will have one or more buckets as designated &#8220;processing zones&#8221;, which store different stages of processed data. To keep your data catalog up to date, you&#8217;ll have AWS Glue Crawlers crawl the final processed zone on a recurring basis.</p><p>For the actual data processing / transformation steps, you have three main options. The simplest one is AWS Lambda, which is a stupid simple serverless compute service. You define a function in a language such as python and set up rules regarding when the function gets triggered and what happens downstream. For data engineering, lambda is commonly used for setting up data validation checks or light data transformations. You can have tons of lambdas triggering per second, but the main limitation is the amount of data it can process at once. For bigger workloads, reach for AWS Glue or EMR (Elastic Map Reduce). Glue is used for building ELT pipelines and is built on top of apache spark while EMR is used to run big data frameworks (such as spark, trino, and pig) for processing data. Glue is serverless and simpler to setup than EMR, which provides more customizability and better performance at scale on large workloads. EMR is also used for data ingestion due to its highly customizable and powerful data processing.</p><h3>Consumption</h3><p>This layer is quite straightforward as there is only one option for each consumption-use case. If you want to query your data catalog (or warehouse), use AWS Athena. If you want to build visualizations, dashboards, or reports, use AWS QuickSight. Finally, if you want to do machine learning, you will most likely use AWS SageMaker (I know there are other options here, but I personally haven&#8217;t looked into them extensively).</p><p>One small nuance worth mentioning is that these consumption tools can be used on either your data catalog (your S3 lake) or your AWS RedShift data warehouse (if you chose to set that up). Usually the warehouse will host a subset of the lake&#8217;s data for higher performance querying at the tradeoff of higher storage cost.</p><h3>Orchestration</h3><p>The last main class of services data engineers should know in AWS relate to workflow orchestration. A popular option is Glue, but its limited to orchestrating Glue tasks (Glue jobs, crawlers, and triggers). If you aren&#8217;t using Glue it makes more sense to use AWS Step Functions, which has tight integration with most AWS services. You can define your pipelines using amazon state language or interactively with a UI.</p><p>Finally, my favorite choice for orchestration is AWS Managed Workflows for Apache Airflow (MWAA). Since most data teams are intimately familiar with Airflow or one of its popular descendants (such as Prefect and Dagster), this option is the most portable. Defining your orchestration workflows in python code is better from a reproducibility and engineering perspective than the other options which are only available in AWS.</p>]]></content:encoded></item><item><title><![CDATA[How to get started with apache superset and docker compose in 5 minutes]]></title><description><![CDATA[Super lightweight, less than 100 lines of code, and easy to integrate within your existing docker compose project]]></description><link>https://criticalsystems.substack.com/p/how-to-get-started-with-apache-superset</link><guid isPermaLink="false">https://criticalsystems.substack.com/p/how-to-get-started-with-apache-superset</guid><dc:creator><![CDATA[Sammy]]></dc:creator><pubDate>Wed, 28 Jan 2026 03:49:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FVPa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Link to repo with setup instructions: <a href="https://github.com/sammyhansali/superset-docker-quickstart">sammyhansali/superset-docker-quickstart</a></p><h1>What is Apache Superset?</h1><p>Analysts use Business Intelligence (BI) tools to build data visualizations, reports, and dashboards that tell a story on how the business performed, is performing, or will perform. Compared to its older siblings data science and machine learning, BI is the most accessible method by which organizations can turn data into insights.</p><p>Apache Superset is one such BI software. An open source one at that! As someone that wants to learn at least one open-source tool per component of the data engineering lifecycle, Superset seemed like a great match for my projects.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FVPa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FVPa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png 424w, https://substackcdn.com/image/fetch/$s_!FVPa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png 848w, https://substackcdn.com/image/fetch/$s_!FVPa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png 1272w, https://substackcdn.com/image/fetch/$s_!FVPa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FVPa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png" width="1456" height="726" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.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;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Build Customer Facing Data Applications Using the Preset Embedded Dashboard  SDK | Preset&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="Build Customer Facing Data Applications Using the Preset Embedded Dashboard  SDK | Preset" title="Build Customer Facing Data Applications Using the Preset Embedded Dashboard  SDK | Preset" srcset="https://substackcdn.com/image/fetch/$s_!FVPa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png 424w, https://substackcdn.com/image/fetch/$s_!FVPa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png 848w, https://substackcdn.com/image/fetch/$s_!FVPa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.png 1272w, https://substackcdn.com/image/fetch/$s_!FVPa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34a6c8e8-f19f-4561-8799-9badfd9fbca4_4038x2014.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">An example BI dashboard created with Superset</figcaption></figure></div><h1>Setup issues and how I fixed them</h1><p>The main issue I had with Superset initially was finding a <strong>minimal and simple</strong> way of running it with docker compose. It had to have a small footprint and easily integrate with the other services I would be running (such as airflow). I looked to the official documentation and LLMs for help, but they weren&#8217;t very helpful. That&#8217;s when I stumbled upon <a href="https://www.youtube.com/watch?v=vMgFadPxOLk">this video</a> by a data engineer named Calvin Yoon.</p><p>He stripped down the docker compose template provided by superset down to its essentials (sure, you could probably strip it down a lot more if you wanted to, but its already a big improvement from following superset&#8217;s official instructions of cloning the <em>whole</em> repository and working with that).</p><p>All you need is less than 100 lines added to your docker compose and a folder containing some bash scripts and configs. Here&#8217;s a look at what the docker compose would look like if you were only running superset and no other services:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d_bz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d_bz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png 424w, https://substackcdn.com/image/fetch/$s_!d_bz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png 848w, https://substackcdn.com/image/fetch/$s_!d_bz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png 1272w, https://substackcdn.com/image/fetch/$s_!d_bz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d_bz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png" width="1456" height="3402" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3402,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1114948,&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://criticalsystems.substack.com/i/185377049?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.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_!d_bz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png 424w, https://substackcdn.com/image/fetch/$s_!d_bz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png 848w, https://substackcdn.com/image/fetch/$s_!d_bz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.png 1272w, https://substackcdn.com/image/fetch/$s_!d_bz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805b5c0b-e109-4269-88d9-adfbf55aa597_1996x4664.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">Docker compose file from <a href="https://github.com/sammyhansali/superset-docker-quickstart">sammyhansali/superset-docker-quickstart</a></figcaption></figure></div><p>We&#8217;re basically just setting up the: superset database (postgres), caching (redis), a container to handle initialization, and a container for the superset app itself.</p><p>You may also notice the environment variable on line 68 that appears to turn off examples. If you change that to &#8220;yes&#8221; and run docker compose up, superset should launch with some visual examples you can explore and learn from.</p><h1>Conclusion</h1><p>That&#8217;s basically it!</p><p>If you want to try running this for yourself, take a gander at the repo accompanying this article. It has all the code and startup instructions. Here is the link for that again: <a href="https://github.com/sammyhansali/superset-docker-quickstart">sammyhansali/superset-docker-quickstart</a></p>]]></content:encoded></item><item><title><![CDATA[Data Quality in dbt]]></title><description><![CDATA[Explaining dbt's various data quality tools and best practices]]></description><link>https://criticalsystems.substack.com/p/data-quality-in-dbt</link><guid isPermaLink="false">https://criticalsystems.substack.com/p/data-quality-in-dbt</guid><dc:creator><![CDATA[Sammy]]></dc:creator><pubDate>Thu, 11 Dec 2025 02:40:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nrhc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Data build tool, more commonly known as <strong>dbt</strong>, is a python tool that allows you to write, document, test, and execute transformation code for ELT pipelines. dbt is great for data teams that want to make their transformation pipelines more modular, observable, and following software engineering best practices. Another selling point of dbt is its standout data quality features - which is the focus of this article.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nrhc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nrhc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png 424w, https://substackcdn.com/image/fetch/$s_!nrhc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png 848w, https://substackcdn.com/image/fetch/$s_!nrhc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png 1272w, https://substackcdn.com/image/fetch/$s_!nrhc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nrhc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png" width="727" height="420.9210164835165" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:843,&quot;width&quot;:1456,&quot;resizeWidth&quot;:727,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!nrhc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png 424w, https://substackcdn.com/image/fetch/$s_!nrhc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png 848w, https://substackcdn.com/image/fetch/$s_!nrhc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.png 1272w, https://substackcdn.com/image/fetch/$s_!nrhc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb8c90a-1834-48f2-a948-9673d64b1083_3840x2224.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><h2>The dbt data quality toolkit</h2><p>dbt provides two main data quality features, tests and model contracts. Contracts enforce your data&#8217;s *shape*: field names, types, and constraints (Not all constraints are enforceable, however. This depends on your dbt model&#8217;s materialization strategy and your specific data warehousing platform). Tests are exactly what they sound like: lines of code that test your data&#8217;s integrity, logical structure, and more. </p><p>Let&#8217;s talk more about tests because there is a lot going on here. Generally there are two types of tests, data tests and unit tests. The latter should sound familiar to those with a background in software. Unit tests in dbt work by taking a sample provided input and output and checking if the model produces the expected output.</p><p>Within data tests, there is yet another bifurcation into generic and singular data tests. Singular tests are any kind of test written for a single scenario. Some common uses of singular tests include checking assumptions (such as, <code>order_amount_dollars &gt;= 0</code>) or other business logic (such as, <code>revenue - expenses = profit</code>). Generic tests, as they sound, are data tests that are reusable for multiple scenarios. Unlike singular tests which can be written to take multiple dbt models and multiple columns into account, generic tests can only be applied to one model and column. </p><p>Finally, there are two types of generic tests: built-in and custom. dbt comes with four built-in generic tests: <code>not_null</code>, <code>unique</code>, <code>accepted_values</code>, and <code>relationships</code>. Use them to test if columns respect the corresponding SQL constraints. Other &#8220;built-in&#8221; generic tests can be imported from dbt packages, such as <code>dbt-expecations</code>. If you want to make your own generic test, such as a test that checks if a column is positive, that is called a custom generic test.</p><h2>Brief notes on implementation</h2><p>Data tests, specifically singular and custom generic tests, are defined in <code>.sql</code> files in your dbt project&#8217;s <code>./tests</code> and <code>./tests/generic</code> directories, respectively.  Singular tests are written as a sql query that returns rows that violate the test. Custom generic tests are written in a similar fashion, but require additional jinja templating.</p><p>Data tests are activated once written under the <code>data_tests</code> or <code>tests </code>attribute for a model as defined in a yaml file in the project directory (typically in the same directory as the model). Unit tests are defined and activated once written under the <code>unit_tests </code>attribute for a model, in the same type of yaml file.</p><p>~</p><p>Hopefully that served as a useful introduction to the different tools you have available to you in dbt&#8217;s data quality tool kit! Below are some helpful links that helped me understand everything:</p><ul><li><p>https://www.metaplane.dev/blog/dbt-test-examples-best-practices#types-of-tests-in-dbt</p></li><li><p>https://docs.getdbt.com/blog/announcing-unit-testing</p></li><li><p>https://docs.getdbt.com/reference/resource-configs/contract</p></li><li><p>https://docs.getdbt.com/docs/mesh/govern/model-contracts#how-are-contracts-different-from-tests</p></li><li><p>https://docs.getdbt.com/docs/build/data-tests</p></li></ul>]]></content:encoded></item><item><title><![CDATA[T-SQL Fundamentals: Theory, Database Workloads, and Server Architecture]]></title><description><![CDATA[Learnings from chapter 1 of Itzik Ben-Gan's book "T-SQL Fundamentals, Fourth Edition".]]></description><link>https://criticalsystems.substack.com/p/t-sql-fundamentals-theory-database</link><guid isPermaLink="false">https://criticalsystems.substack.com/p/t-sql-fundamentals-theory-database</guid><dc:creator><![CDATA[Sammy]]></dc:creator><pubDate>Sun, 18 May 2025 20:03:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XO3o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Intro</h1><p>I&#8217;ve recently finished reading Itzik Ben-Gan's book "T-SQL Fundamentals, Fourth Edition", and thought it would be helpful to distill some of the more conceptual topics from the first chapter. This was difficult to write and there are some oversimplifications at certain points, but overall it helped me improve my understanding.</p><h1>Theoretical background to T-SQL querying and programming</h1><p>Structured data is stored in tables, with rows and columns, within relational databases. Relational database management system (RDBMS) software is used to query and manipulate these tables. These operations are performed using the SQL (structured query language) programming language.</p><p>Each RDBMS implements a different "dialect" of standard SQL. Each dialect extends a subset of the SQL standard and adds vendor-specific extensions. For SQL Server (Microsoft's on premises RDBMS), a dialect called T-SQL (Transact SQL) is supported. It adds richer metadata, error-handling, control flow, and more.</p><p>The R in RDBMS stands for "relational". This is because RDBMS's are based on the "relational model". This model enables consistency, completeness, and integrity for data management. It is built upon a branch of mathematics called relational algebra, which itself is based on two other branches of mathematics: set theory and predicate logic. Set theory is concerned with a mathematical object called a set, which is a collection of distinct objects in a collection. Sets that are non-distinct are called multisets (or bags). Predicate logic is concerned with predicates. In two-valued predicate logic, expressions are either true or false. In three-valued predicate logic, which T-SQL supports, an expression can also evaluate as unknown.</p><p> Relational algebra itself is concerned with operations performed on a mathematical object called a relation. Mathematically, a relation is a representation of a set. In the relational model, a relation is a table. In a fully normalized database, there is one relation for each entity (such as Customer, Order, or Order Details). A de-normalized database introduces redundancy. Each relation has a set of attributes (or columns) with a name, data type, and (optional) constraint. Relations also have a set of tuples (or rows) which comprise the table. Predicates can be used to define constraints on attributes to ensure data integrity.</p><h1>Types of database workloads</h1><p>An OLTP database is a database where you store transactional data - data that adds, modifies, or deletes data on a regular basis. OLTP stands for "online transactional processing". OLTP databases are usually highly normalized, following the relational model, which leads to poor performance on analytical/reporting queries since they require many joins.</p><p>A data warehouse is a database that stores analytical data - data that is more de-normalized and requires minimal processing time for analytical/reporting queries. Here, the data is modeled into a schema design such as a star (one fact table and several dimensions tables that relate to it) or a snowflake (an expanded version of the star). Data warehouses can also have data marts, which are like mini-data warehouses designed for particular entities (such as for the Sales department, Marketing department, etc).</p><p>In many data pipelines, an ETL/ELT software regularly extracts data from an OLTP database into a data staging area (DSA), transforms it, and loads it into the data warehouse.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XO3o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XO3o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png 424w, https://substackcdn.com/image/fetch/$s_!XO3o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png 848w, https://substackcdn.com/image/fetch/$s_!XO3o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png 1272w, https://substackcdn.com/image/fetch/$s_!XO3o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XO3o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png" width="481" height="353" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:353,&quot;width&quot;:481,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22573,&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://hansali.substack.com/i/163870978?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.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_!XO3o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png 424w, https://substackcdn.com/image/fetch/$s_!XO3o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png 848w, https://substackcdn.com/image/fetch/$s_!XO3o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png 1272w, https://substackcdn.com/image/fetch/$s_!XO3o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e5ff4eb-c9db-47bc-b1a1-0c3b86b1da60_481x353.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h1>SQL Server Architecture</h1><p>How is data managed in on-premises SQL Server? There are two aspects to consider: logical and physical.</p><h2>Logical Architecture</h2><p>In Microsoft SQL Server, there are multiple instances of the server stored on the same computer. One instance must be default, the others are named. These instances serve as contained environments. You specify the instance you want to access during server connection time.</p><p>Each instance is composed of databases, which are containers of database objects (such as tables, views, and stored procedures). There are two types of databases: user-defined databases and system databases. There are five system databases: master, model, tempdb, msdb, and Resource. </p><ul><li><p><code>master </code>holds system-wide metadata, server configuration data, instance-specific data, and initialization information.</p></li><li><p><code>model </code>is used as a template for creating user-defined databases. Each new database is created as a copy of the `model` database.</p></li><li><p><code>tempdb </code>is used to store temporary data, such as: temporary tables, sort and hash table data (when needed to persist those), row versioning, and more. This database is destroyed and recreated whenever the SQL Server instance is restarted.</p></li></ul><ul><li><p><code>msdb </code>is used by the SQL Server Agent service to store its data. Also holds info related to other SQL Server features (dbmail, service broker, backups, and more).</p></li><li><p><code>Resource </code>is a hidden, read-only db holding definitions of all system objects. All system objects in a database appear to be in that database's `sys` schema, but actually their definitions reside in the `Resource` database.</p></li></ul><p>Each database is composed of schemas, and each schema contains database objects.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8aV1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8aV1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png 424w, https://substackcdn.com/image/fetch/$s_!8aV1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png 848w, https://substackcdn.com/image/fetch/$s_!8aV1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png 1272w, https://substackcdn.com/image/fetch/$s_!8aV1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8aV1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png" width="435" height="296" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d16deada-119b-4b4c-ad78-6503abe02d77_435x296.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:296,&quot;width&quot;:435,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19964,&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://hansali.substack.com/i/163870978?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.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_!8aV1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png 424w, https://substackcdn.com/image/fetch/$s_!8aV1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png 848w, https://substackcdn.com/image/fetch/$s_!8aV1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png 1272w, https://substackcdn.com/image/fetch/$s_!8aV1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd16deada-119b-4b4c-ad78-6503abe02d77_435x296.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>Physical Architecture</h2><p>Physically, databases are made up of at least one data file, at least one transaction log file, and (optionally) checkpoint files holding memory-optimized data. Data files are organized into logical groups called filegroups, which are targets for creating a database object. When you create an object, its data is physically distributed across files in that filegroup. You must have at least one primary file group, which contains the primary data file (a .mdf extension). Non-primary data files have a .ndf extension and log files have a .ldf 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_!7GBX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7GBX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png 424w, https://substackcdn.com/image/fetch/$s_!7GBX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png 848w, https://substackcdn.com/image/fetch/$s_!7GBX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png 1272w, https://substackcdn.com/image/fetch/$s_!7GBX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7GBX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png" width="703" height="435" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:435,&quot;width&quot;:703,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38849,&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://hansali.substack.com/i/163870978?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.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_!7GBX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png 424w, https://substackcdn.com/image/fetch/$s_!7GBX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png 848w, https://substackcdn.com/image/fetch/$s_!7GBX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png 1272w, https://substackcdn.com/image/fetch/$s_!7GBX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7231b543-cd5d-4ccb-b665-e17e28bb378e_703x435.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item></channel></rss>