<?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[M365 Show -  Microsoft 365 Digital Workplace Daily]]></title><description><![CDATA[M365 Show brings you expert insights, news, and strategies across Power Platform, Azure, Security, Data, and Collaboration in the Microsoft ecosystem.]]></description><link>https://newsletter.m365.show</link><image><url>https://substackcdn.com/image/fetch/$s_!lvpM!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F185d552e-dd17-493f-8d6d-df2df34c23c3_1280x1280.png</url><title>M365 Show -  Microsoft 365 Digital Workplace Daily</title><link>https://newsletter.m365.show</link></image><generator>Substack</generator><lastBuildDate>Wed, 17 Jun 2026 00:19:01 GMT</lastBuildDate><atom:link href="https://newsletter.m365.show/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Mirko Peters]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[mirko.peters@datascience.show]]></webMaster><itunes:owner><itunes:email><![CDATA[mirko.peters@datascience.show]]></itunes:email><itunes:name><![CDATA[Mirko Peters - M365 Specialist]]></itunes:name></itunes:owner><itunes:author><![CDATA[Mirko Peters - M365 Specialist]]></itunes:author><googleplay:owner><![CDATA[mirko.peters@datascience.show]]></googleplay:owner><googleplay:email><![CDATA[mirko.peters@datascience.show]]></googleplay:email><googleplay:author><![CDATA[Mirko Peters - M365 Specialist]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[SharePoint Governance: Best Practices and Guide]]></title><description><![CDATA[Master platform governance! Get best practices for compliance, security, and lifecycle management. Prepare your tenant for Copilot with this essential guide.]]></description><link>https://newsletter.m365.show/p/sharepoint-governance-best-practices</link><guid isPermaLink="false">https://newsletter.m365.show/p/sharepoint-governance-best-practices</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Fri, 08 May 2026 11:59:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Hpsm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hpsm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hpsm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!Hpsm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!Hpsm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!Hpsm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hpsm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34c8446e-ce34-46c7-9266-f20564830927_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1939244,&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://newsletter.m365.show/i/196532316?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Hpsm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!Hpsm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!Hpsm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!Hpsm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8446e-ce34-46c7-9266-f20564830927_1672x941.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><blockquote><p>&#8220;Governance is no longer about documents and folders&#8212;it&#8217;s about controlling how your entire digital workplace thinks, shares, and learns.&#8221; - <a href="https://www.linkedin.com/in/m365showpodcast/">Mirko Peters</a></p></blockquote><h1>SharePoint Governance Playbook: Your Guide to Future-Ready Collaboration</h1><p>Let me level with you: SharePoint and Microsoft 365 aren&#8217;t getting any simpler. Between the boom in remote work, AI rolling throug&#8230;</p>
      <p>
          <a href="https://newsletter.m365.show/p/sharepoint-governance-best-practices">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Microsoft Copilot Governance Playbook]]></title><description><![CDATA[Master AI compliance with our Copilot Governance Playbook. Implement a robust governance strategy, sensitivity labels, and controls for your AI deployment.]]></description><link>https://newsletter.m365.show/p/microsoft-copilot-governance-playbook</link><guid isPermaLink="false">https://newsletter.m365.show/p/microsoft-copilot-governance-playbook</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Thu, 07 May 2026 11:22:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!90oy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!90oy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!90oy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!90oy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!90oy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!90oy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!90oy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1972921,&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://newsletter.m365.show/i/196531170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!90oy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!90oy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!90oy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!90oy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f1b970-46ef-40e9-8a62-2716a54e126d_1672x941.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><blockquote><p>&#8220;Every Copilot response is a compliance event&#8212;<br>governance is how you control the outcome.&#8221; - <a href="https://www.linkedin.com/in/m365showpodcast/">Mirko Peters</a></p></blockquote><h1>Microsoft Copilot Governance Playbook: The 2026 Strategic Guide</h1><p>This playbook is your one-stop shop for building a Microsoft Copilot governance program that actually works. Weaving together proven strategies and real-world checklists, it gives you ever&#8230;</p>
      <p>
          <a href="https://newsletter.m365.show/p/microsoft-copilot-governance-playbook">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Microsoft Entra ID Governance: Tenant Deployment Guide]]></title><description><![CDATA[Deploy identity governance for your tenant. Manage workflows, privileged access, and on-premises Active Directory with this comprehensive guide.]]></description><link>https://newsletter.m365.show/p/microsoft-entra-id-governance-tenant</link><guid isPermaLink="false">https://newsletter.m365.show/p/microsoft-entra-id-governance-tenant</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Wed, 06 May 2026 11:31:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3G67!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3G67!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3G67!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!3G67!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!3G67!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!3G67!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3G67!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f616e89c-d760-496c-8234-18aa7772864f_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1919947,&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://newsletter.m365.show/i/196530103?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3G67!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!3G67!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!3G67!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!3G67!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff616e89c-d760-496c-8234-18aa7772864f_1672x941.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><blockquote><p>&#8220;This isn&#8217;t about managing users&#8212;<br>it&#8217;s about controlling who can impact your business.&#8221; - <a href="https://www.linkedin.com/in/m365showpodcast/">Mirko Peters</a></p></blockquote><h1>Microsoft Entra ID Governance Playbook</h1><p>If you&#8217;re sitting there wondering, &#8220;How do I actually keep control of all the IDs, roles, and access scattered across Microsoft cloud?&#8221; then you&#8217;re in the right spot. This playbook is your no-nonsense guide to govern&#8230;</p>
      <p>
          <a href="https://newsletter.m365.show/p/microsoft-entra-id-governance-tenant">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Teams Governance: Best Practices for Lifecycle & Data Security]]></title><description><![CDATA[Elevate your Teams governance with best practices for lifecycle management, data security, and governance policies. Includes templates for optimal control.]]></description><link>https://newsletter.m365.show/p/teams-governance-best-practices-for</link><guid isPermaLink="false">https://newsletter.m365.show/p/teams-governance-best-practices-for</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Tue, 05 May 2026 11:16:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gsKT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gsKT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gsKT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!gsKT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!gsKT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!gsKT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gsKT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1782081,&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://newsletter.m365.show/i/196528586?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gsKT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!gsKT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!gsKT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!gsKT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b9e83cb-6467-4b69-a697-c5faaf5ea005_1672x941.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><blockquote><p>&#8220;Microsoft 365 doesn&#8217;t fail because of technology&#8212;<br>it fails without governance.&#8221; - <a href="https://www.linkedin.com/in/m365showpodcast/">Mirko Peters</a></p></blockquote><h1>Microsoft 365 Governance Framework Playbook</h1><p>This playbook provides a comprehensive guide to building and operationalizing a Microsoft 365 governance framework. Learn real-world strategies for managing identities, securing collaboration, enforcing compliance, and&#8230;</p>
      <p>
          <a href="https://newsletter.m365.show/p/teams-governance-best-practices-for">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How Microsoft 365 Copilot Exposes Your Hidden Security Risks]]></title><description><![CDATA[Most leaders believe that governance is a collection of policies, committees, and administrative controls.]]></description><link>https://newsletter.m365.show/p/how-microsoft-365-copilot-exposes</link><guid isPermaLink="false">https://newsletter.m365.show/p/how-microsoft-365-copilot-exposes</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Fri, 10 Apr 2026 08:20:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/XMSXMAK_dUk" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most leaders believe that governance is a collection of policies, committees, and administrative controls. They look at a steering group or a library of standards sitting neatly in a SharePoint folder and feel a sense of security. But if you look closely, you will realize that isn&#8217;t actually governance&#8212;it is just the documentation surrounding it. In the&#8230;</p>
      <p>
          <a href="https://newsletter.m365.show/p/how-microsoft-365-copilot-exposes">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Governance Illusion [PODCAST SCRIPT]]]></title><description><![CDATA[Why Your M365 Strategy is Designed to Fail]]></description><link>https://newsletter.m365.show/p/the-governance-illusion-podcast-script</link><guid isPermaLink="false">https://newsletter.m365.show/p/the-governance-illusion-podcast-script</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Thu, 09 Apr 2026 13:23:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WO0J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WO0J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WO0J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WO0J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WO0J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WO0J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WO0J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:137912,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.m365.show/i/193687104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WO0J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WO0J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WO0J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WO0J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F620dd030-c322-4e0e-9988-c6dfb8c1954e_1280x720.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Most leaders think governance is a collection of policies, committees, and administrative controls, but they are usually looking at a steering group or a library of standards sitting neatly in SharePoint. If you look closely, you&#8217;ll realize that isn&#8217;t actually governance, because it is just the documentation surrounding it. In the world of Microsoft 365&#8230;</p>
      <p>
          <a href="https://newsletter.m365.show/p/the-governance-illusion-podcast-script">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Use PowerShell with Microsoft Graph API]]></title><description><![CDATA[If you want to tie together automation and the Microsoft 365 world, learning how to use PowerShell with the Microsoft Graph API is a must.]]></description><link>https://newsletter.m365.show/p/how-to-use-powershell-with-microsoft</link><guid isPermaLink="false">https://newsletter.m365.show/p/how-to-use-powershell-with-microsoft</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Sat, 03 Jan 2026 14:30:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hDf3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fpodcast-episode_1000740348247.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you want to tie together automation and the Microsoft 365 world, learning how to use PowerShell with the Microsoft Graph API is a must. This guide gives you a step-by-step path&#8212;from module installation and authentication to managing permissions and optimizing your scripts. Whether the goal is everyday admin functions or wrangling thousands of records&#8230;</p>
      <p>
          <a href="https://newsletter.m365.show/p/how-to-use-powershell-with-microsoft">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[📧 DATA TALK WEEKLY — Issue #1]]></title><description><![CDATA[A Professional Newsletter for Power BI Developers, Fabric Architects & Data Engineers]]></description><link>https://newsletter.m365.show/p/data-talk-weekly-issue-1</link><guid isPermaLink="false">https://newsletter.m365.show/p/data-talk-weekly-issue-1</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Thu, 04 Dec 2025 14:54:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sCFd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>&#129517; <strong>This Week&#8217;s Deep Dive</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sCFd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sCFd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!sCFd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!sCFd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!sCFd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sCFd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2234289,&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://newsletter.m365.show/i/180706465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.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_!sCFd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!sCFd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!sCFd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!sCFd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51a6ac09-c4c8-47be-9e2c-5c6b1054423e_1536x1024.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><h1><strong>The Doctrine of Distribution: Why Your Power BI Reports Require Apostolic Succession</strong></h1><p>Power BI teams love to talk about &#8220;single source of truth&#8221;&#8230;<br>until they ship dashboards like missionaries without scripture.</p><p>We cover:</p><ul><li><p>Why distribution is the missing BI discipline</p></li><li><p>How workspace sprawl creates contradictory &#8220;truths&#8221;</p></li><li><p>Why org apps are you&#8230;</p></li></ul>
      <p>
          <a href="https://newsletter.m365.show/p/data-talk-weekly-issue-1">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Microsoft Just Fixed Doc Libs: What You Missed]]></title><description><![CDATA[Opening &#8211; Hook + Teaching Promise]]></description><link>https://newsletter.m365.show/p/microsoft-just-fixed-doc-libs-what</link><guid isPermaLink="false">https://newsletter.m365.show/p/microsoft-just-fixed-doc-libs-what</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Thu, 20 Nov 2025 17:08:07 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176782750/3d38d1c1530d48acbae385f0af335e30.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Opening &#8211; Hook + Teaching Promise</h2><p>You&#8217;ve been using Doc Libs like a dumping ground&#8212;files vanish, views lie, and nobody knows where anything lives. The truth? Microsoft quietly fixed the mess. UX, Forms, Autofill, and Copilot now turn folders into an intelligent system that actually guides work.</p><p>You&#8217;ll learn the new layout, how to control input with Forms, automate metadata with Autofill, and weaponize Copilot. Quick payoff: compare versions instantly, generate abstracts, and build views your team will actually use. There&#8217;s one adoption&#8209;killing mistake&#8212;and one setting that fixes it&#8212;coming up. Now let&#8217;s rip out the old mental model and install the new one.</p><h2>The New Doc Libs UX: Navigation That Actually Helps Work Happen</h2><p>Let&#8217;s start with why this matters. Discoverability cuts meeting time. Fewer clicks reduce errors. Obvious context prevents &#8220;Where did my files go?&#8221; drama. You don&#8217;t need more storage; you need a surface that shows intent. The new Doc Libs experience finally behaves like a workbench, not a closet.</p><p>Enter the enhanced breadcrumb. It&#8217;s not just a path; it&#8217;s a jump drive. You can hop across folders and even between libraries in the same site without losing your place. Translation: no more backing out six levels because someone nested a &#8220;Final_Final_v3&#8221; folder. You stay oriented, you move faster, and&#8212;novel idea&#8212;you finish the task.</p><p>Front and center, you&#8217;ll see the View switcher with filter pills. The thing most people miss is state visibility. Views aren&#8217;t magic if users can&#8217;t see what&#8217;s applied. Those filter pills are the visible brain: hover to see exactly which filters are active, clear them in one click, and stop gaslighting yourself about missing files. If you remember nothing else, remember this: visible filters end blame games.</p><p>Now, the one&#8209;stop Options hub. This is where beginners become competent. Views, filters, formatting, grid edit&#8212;it&#8217;s all centralized and predictable. No scavenger hunt, no &#8220;where did Microsoft hide it this week?&#8221; You want Quick Edit? It&#8217;s here. You want conditional formatting? Here. You want to save the chaos you just tamed into a reusable view? Also here.</p><p>Layout controls matter more than you think. Compact when you need density. List when you need balance. Autofit when text fields expand and you actually want to read them without dragging column widths like a medieval torture device. Pair that with sort and group: sort by Reading Time to triage quick wins, group by Category to bucket work by intent. These aren&#8217;t cosmetics; they&#8217;re decision accelerators.</p><p>Board view is the serial-process secret. Think lanes for Status: New, Needs Review, Reviewed, Ready. Each file becomes a card with the metadata you choose&#8212;rating, abstract, thumbnail&#8212;configured in the card designer. Drag to advance and you&#8217;ve just turned a document library into a lightweight pipeline. For teams allergic to yet another app, this is your Kanban without the overhead.</p><p>Saving views properly is the line between &#8220;my setup&#8221; and &#8220;team muscle memory.&#8221; The Unsaved changes cue is your accountability partner. Click it. Name the view something that teaches behavior&#8212;&#8220;Reviewed &amp; Ready,&#8221; not &#8220;Steve&#8217;s View.&#8221; Choose public if the team should live there, personal if it&#8217;s your sandbox. And yes, publish defaults intentionally; don&#8217;t force users to decode your private preferences.</p><p>Here&#8217;s the shortcut nobody teaches: combine filter pills with conditional formatting. Pill shows the current slice; formatting paints the states you care about. For example, let Reviewed items glow purple while the pill narrows to Category = Research. You see the subset and the priority at a glance. That&#8217;s how you guide attention without writing a policy memo.</p><p>Before we continue, you need to understand the trap: views organize output, but the real war is input. If you rely on humans to supply perfect filenames and flawless metadata, you&#8217;ll lose. Every time. The game&#8209;changer nobody talks about is controlling the front door. Once you nail intake, everything else clicks. Now we fix how files enter the system so your beautiful views stay beautiful.</p><h2>Fixing Input: Forms for Doc Libs = The Adoption Lever</h2><p>If you build it, they won&#8217;t come&#8212;unless adding files is idiot&#8209;proof. That&#8217;s not an insult; it&#8217;s a survival strategy. The average user will happily upload &#8220;Doc1.docx&#8221; three times and vanish. Your job is to remove choices, reduce friction, and make the right path the only path. Enter Forms for document libraries: the controlled front door normal people can actually use without breaking your taxonomy.</p><p>The truth? Adoption dies at the point of entry. If intake is messy, your views rot, your filters lie, and your board lanes turn into a junk drawer. Forms flips the script. Instead of dropping files into random folders, users hit a clean, branded form that asks only what matters, then parks submissions in a dedicated responses folder. Containment first, order next.</p><p>Design the form like you&#8217;re allergic to cognitive load. Add your logo so people know it&#8217;s official. Pick a theme that matches your site&#8212;coherent visuals signal &#8220;we thought this through.&#8221; Write prompts like a human: &#8220;What&#8217;s the document about?&#8221; not &#8220;Provide abstract.&#8221; Mark only true must&#8209;haves as required. If you force users to guess, they&#8217;ll guess wrong or walk away.</p><p>Now for the decision that separates pros from amateurs: choose what users must provide versus what Autofill handles. If AI can infer it, don&#8217;t ask for it. Reading time? Autofill. Abstract? Autofill. Category? Often Autofill, then let humans override. Reserve required questions for decisions only humans can make&#8212;status, sensitivity, or business owner. You&#8217;re not collecting trivia; you&#8217;re capturing intent.</p><p>Branching logic is where the form gets smart. Show fields based on category or status so irrelevant questions never appear. If Category = Marketing, reveal &#8220;Campaign&#8221; and &#8220;Region.&#8221; If Category = Finance, reveal &#8220;Invoice Number&#8221; and &#8220;Vendor.&#8221; This is not flair; it&#8217;s respect for the submitter&#8217;s time. Fewer choices, fewer mistakes, higher completion rates. The form feels shorter because it is.</p><p>Turn on notifications if you actually want to respond. Opt&#8209;in alerts mean you&#8217;ll notice submissions within minutes instead of discovering them during quarterly audits. Set the message to something useful: &#8220;New submission: Category=Research, Status=Needs Review.&#8221; Your inbox becomes a triage console, not a guilt factory. Yes, you can filter and route these later with automation, but start with visibility.</p><p>About the responses folder: it&#8217;s a safety buffer, not a landfill. All submissions land there first, so nothing contaminates the published library until it&#8217;s reviewed. Schedule a daily triage habit. Open the view &#8220;New Submissions,&#8221; scan with filter pills, and move approved items to the root or proper folder. The game&#8209;changer? Pair this with a Quick Step like &#8220;Move to Root&#8221; so it&#8217;s one click, not a scavenger hunt.</p><p>Let&#8217;s address the limitation you&#8217;re about to trip over: external or anonymous submission isn&#8217;t available at launch for document library forms. So you have options. For external partners, use Request Files for simple intake, then manually enrich metadata&#8212;or build a Power Automate flow to apply defaults and kick off Autofill. Track Microsoft&#8217;s roadmap so you don&#8217;t duct&#8209;tape forever. Roadmap awareness is a competency, not a hobby.</p><p>The mistake that ruins adoption is over&#8209;collecting. Teams slap ten required fields on the form to &#8220;ensure data quality,&#8221; then complain nobody submits. The fix is painfully simple: ask only what humans must decide and let Autofill do the grunt work. You can always enhance metadata post&#8209;submit when the file actually exists and Copilot can read it.</p><p>Two micro&#8209;stories. First, a team cut form fields from eight to three&#8212;Title, Category, Owner&#8212;and let Autofill generate Abstract and Reading Time. Submissions doubled in a week, and reviewers stopped playing detective. Second, another team kept &#8220;Attachments,&#8221; &#8220;Sub&#8209;category,&#8221; &#8220;Sub&#8209;sub&#8209;category,&#8221; and three date pickers. Users bypassed the form and emailed files. Congratulations, you built a trap. They walked around it.</p><p>Implementation checklist you can copy today: create the form; remove every field Autofill can infer; add branching so each category sees only relevant prompts; enable notifications; publish the link in Teams with &#8220;Use this or we won&#8217;t review your document&#8221; energy; and schedule a daily ten&#8209;minute triage. That&#8217;s the operating cadence. No heroics, just consistency.</p><p>Once intake is clean and constrained, your beautiful views stop decaying. And now removing data entry is where the magic starts. Switch on column Autofill, let the files tell you what they are, and watch your metadata fill itself in the background while you do actual work. This is where Doc Libs stops being a dumping ground and starts behaving like an intelligent system.</p><h2>Column Autofill: Stop Typing Metadata&#8212;Let the Files Tell You</h2><p>Manual metadata is where good systems go to die. You know this. People won&#8217;t count words, won&#8217;t write abstracts, and won&#8217;t pick the right category after a long day of pretending email is project management. The truth? Column Autofill exists so you stop begging and start automating. It reads the file, extracts signals, and writes consistent values without a single &#8220;pretty please.&#8221;</p><p>What Autofill actually does is simple: it opens documents, looks at content, and computes outputs you define. Word count? Easy. From there, it calculates reading time&#8212;at a speed you specify&#8212;so you can triage work by effort, not guesses. It can summarize content into a punchy abstract, infer category from language cues, and pull structured fields from semi&#8209;structured files. The thing most people miss is you control the rules. It&#8217;s not guessing; it&#8217;s following your instructions.</p><p>Authoring Autofill prompts feels like writing policy in plain English. You&#8217;re defining column behavior and the output format to enforce. For Reading Time, you&#8217;d write: &#8220;Estimate minutes to read based on 250 words per minute. Return an integer.&#8221; For Abstract: &#8220;Summarize the key point in one sentence, max 25 words, no colons.&#8221; For Category: &#8220;Choose exactly one from [Marketing, Research, Finance, Operations] based on dominant topic.&#8221; That level of precision prevents chaos later.</p><p>Let me show you how this clicks with actual use cases. Abstracts: generate a one&#8209;liner that makes search and views useful. Categories: autotag by topic so your &#8220;By Category&#8221; view isn&#8217;t a roulette wheel. Reading time: sort your backlog to knock out two&#8209;minute items before meetings. Invoices: extract Invoice Number, Vendor, Due Date; standardize formats like YYYY&#8209;MM&#8209;DD and validate that the number is alphanumeric, eight to twelve characters. You get consistent metadata without spreadsheet cosplay.</p><p>Here&#8217;s the workflow nobody teaches: verify with small batches. Select ten files that represent the range of your content&#8212;short, long, messy, pristine&#8212;then run Autofill. Check results. If Abstracts drift verbose, tighten the word cap. If Category picks &#8220;Research&#8221; for everything, add disambiguation: &#8220;If mentions &#8216;campaign&#8217; or &#8216;CTA,&#8217; prefer Marketing.&#8221; You&#8217;re not training a pet; you&#8217;re calibrating a machine. Small iterations, then scale.</p><p>And yes, you finally get visibility. The new Autofill activity panel shows status as it processes: in queue, in progress, completed, failed. You stop guessing whether it&#8217;s working and start managing throughput. If something fails, you see which file and which column, fix the prompt or the doc, and re&#8209;run. Adults love dashboards for a reason. This is one.</p><p>Best practices, so you don&#8217;t wander into a ditch. Keep prompts concise and prescriptive. Define output formats explicitly&#8212;&#8220;integer,&#8221; &#8220;ISO date,&#8221; &#8220;one of these labels.&#8221; Test edge cases: weird punctuation, tables, bilingual content. Lock formats wherever possible; if the column expects a number, don&#8217;t allow free text. Avoid overfitting to one doc type; your library is not as homogeneous as you think. And document your prompts in the column description so future you doesn&#8217;t reverse&#8209;engineer your own logic.</p><p>Recovery workflows are built in. After edits, re&#8209;run Autofill on selected items so metadata catches up with content. If a prompt goes sideways, bulk clear a column, adjust the rule, and refresh. No panic. No &#8220;we broke the library.&#8221; It&#8217;s a controlled rollback, then a redeploy with better specs. You&#8217;re treating metadata like code, which, frankly, you should have been doing all along.</p><p>Common mistakes are painfully predictable. Duplicating human&#8209;required fields&#8212;asking users for an abstract while Autofill overwrites it&#8212;is how you train people to ignore your system. Don&#8217;t do that. Vague prompts create inconsistent output: &#8220;Write a summary&#8221; yields a novella today and a headline tomorrow. Be specific. Ignoring validation turns lists into junk drawers: if a date column accepts &#8220;ASAP,&#8221; that&#8217;s on you, not the AI.</p><p>Now the payoff you&#8217;ll feel in a week. Once Autofill backfills abstracts and categories, your views become dramatically more useful. &#8220;Reviewed &amp; Ready&#8221; sorted by Reading Time shows snackable wins up top. &#8220;By Category&#8221; actually means something because the labels are consistent. Filter pills start to behave like surgical instruments, not carnival buttons. And spoiler alert: Copilot gets smarter when the metadata is sane. Garbage in, garbage out; structure in, answers out.</p><p>Quick setup sequence you can copy: add columns for Abstract, Category, Reading Time, plus any business&#8209;specific fields. Enable Autofill on each with clear, format&#8209;locked prompts. Run a ten&#8209;file calibration. Fix prompts. Scale to the full folder. Watch the activity panel instead of refreshing like a raccoon on espresso. Then switch your team&#8217;s default view to one that actually uses the new metadata. If they can see the value, they&#8217;ll stop fighting it.</p><p>If you remember nothing else, remember this: stop typing metadata. Let the files tell you what they are, and reserve human judgment for the few decisions that matter. Once you automate the grunt work, everything downstream&#8212;triage, review, and, yes, Copilot&#8212;moves from hopeful to reliable. This is where your library starts earning its keep.</p><h2>Copilot Inside Doc Libs: From File Pile to Answers-on-Demand</h2><p>Reading everything is not a job. Deciding fast is. Copilot turns a file pile into a conversation you can control. The truth? It only shines when your metadata is sane&#8212;thanks, Autofill&#8212;but once you&#8217;ve got structure, Copilot becomes the quickest path from &#8220;What is this?&#8221; to &#8220;What do we do next?&#8221;</p><p>Start with Compare Files. This is the feature that ends version roulette. Select the two&#8212;or up to several&#8212;suspects, click Compare, and Copilot lays out the deltas and themes without you manually opening anything. It flags content changes, surfacing what actually shifted, not just who last touched it. You get patterns, emphasis changes, and the practical verdict: newer, duplicate, or divergent. The game-changer nobody talks about is decision speed. You can kill duplicate drafts confidently, merge insights from two branches, or archive the fossil. Compare that to the old way&#8212;skimming both documents, getting tired halfway, and pretending the differences are &#8220;minor.&#8221; They weren&#8217;t.</p><p>Now use Copilot to generate summaries and abstracts. Yes, Autofill can produce a one-liner, but Copilot is your on-demand copy assistant when you want tone or nuance. Ask for a punchy one-sentence hook, then a three-line synopsis that names the audience and the recommended action. The thing most people miss is the point: short descriptions supercharge search and views. A clean, decisive abstract turns a sea of filenames into a list you can actually scan. And because your Abstract column exists, you paste the best line back into the column and lock the value. Your search hits improve. Your team reads more of the right things. Productivity, mysteriously, rises.</p><p>Audio overview is where comprehension stops blocking your calendar. You&#8217;ve got a 20-page PDF and six meetings. Fine. Have Copilot generate an audio overview and listen while you prep slides or commute. It&#8217;s not entertainment; it&#8217;s a content brief you can absorb without staring at a wall of text. The reason this works is cognitive load. You offload reading, keep context, and arrive at the review with a mental model, not a blank stare. And yes, it still respects permissions. If you don&#8217;t have access, you don&#8217;t get magic whispers. Shocking.</p><p>Q&amp;A over content is Copilot&#8217;s real party trick. Instead of hunting, you ask. &#8220;What&#8217;s changed since the last version?&#8221; &#8220;List the top risks with mitigation.&#8221; &#8220;Is there anything that contradicts our policy on external vendors?&#8221; Copilot answers in plain language and cites the passages, so you can verify before you act. This is how you move from browsing to knowing. It&#8217;s not guessing; it&#8217;s retrieval grounded in your files and your rights. You remain in charge&#8212;ask better questions, get better answers, and clip the references into your review notes.</p><p>The workflow pairing that separates amateurs from pros: take Copilot output and feed your library. Generate an abstract, paste it into the Abstract column. Extract action items, paste the first verb-driven line into a &#8220;Next Step&#8221; column you created for triage. Ask for a suggested Category; if it matches your options, confirm it. You&#8217;re not just reading smarter&#8212;you&#8217;re accelerating review and finalizing views without context switching into other apps. Board view suddenly moves, because you have the confidence to drag Status from Needs Review to Reviewed &amp; Ready based on cited answers, not gut feel.</p><p>Guardrails matter. Copilot is constrained by your permissions and your metadata quality. If the sources are chaotic, the answers will reflect it. That&#8217;s not a bug; it&#8217;s a mirror. Confirm high-impact answers, especially anything legal, financial, or customer-facing. Keep sources visible in the panel and click them. Two-minute spot-checks prevent twenty-hour incident reports. And no, Copilot won&#8217;t read what you can&#8217;t access. The permissions boundary is the line of truth.</p><p>A quick operating model you can adopt tomorrow. In the &#8220;New Submissions&#8221; view, run Compare Files on anything that smells like a duplicate. Delete or archive the loser. Open the surviving file in Copilot and ask for: one-sentence abstract, three key themes, and risks. Paste the abstract into the Abstract column, verify Category, and set Status to Needs Review if a human decision remains&#8212;or Reviewed &amp; Ready if the citations support approval. Optionally, generate an audio overview for the long ones and drop the link in the file comment so stakeholders can absorb it without excuses.</p><p>Common mistakes to avoid. Treating Copilot as gospel is a shortcut to chaos. It&#8217;s a powerful assistant, not a compliance officer. Over-asking vague questions yields vague answers&#8212;be specific: &#8220;Within this document, list the five policy updates from 2024 with section references.&#8221; Ignoring metadata starves Copilot; it&#8217;s faster when Abstract and Category exist. And forgetting to capture outputs back into columns wastes the improvement cycle. If you keep value in the chat, it dies in the chat.</p><p>The payoff? Decision latency collapses. Review cycles shrink because the &#8220;what changed&#8221; and &#8220;why it matters&#8221; are a click away. Your views stop feeling like a museum and start acting like a command center. And yes, once your team experiences this pace, they stop dodging the library and start using it. That&#8217;s adoption. That&#8217;s leverage. Now wire it into your document operating system so this isn&#8217;t a one-off trick&#8212;it&#8217;s how the team works every day.</p><h2>Build the Operating System for Documents: Views, Rules, and Quick Steps </h2><p>You&#8217;ve got the ingredients&#8212;now assemble the kitchen. Define a simple pipeline so nobody improvises: Intake with Forms, Enrich with Autofill, Triage in Board or List, Approve in curated Views, Publish to the place humans actually look. It&#8217;s not bureaucracy; it&#8217;s muscle memory for documents.</p><p>Start with the views you ship by default. &#8220;New Submissions&#8221; points at the responses folder with Status = New. It&#8217;s the inbox&#8212;short, harsh, non-negotiable. &#8220;Needs Review&#8221; filters Status accordingly and sorts by Reading Time ascending so reviewers clear quick wins first. &#8220;Reviewed &amp; Ready&#8221; shows the approved, near-publish items&#8212;group by Category so owners spot their territory. &#8220;By Category&#8221; is your navigational workhorse for stakeholders who filter by topic, not status.</p><p>Layer conditional formatting to guide attention without a meeting. If Status = Needs Review, make the row amber. If Reviewed &amp; Ready, paint it purple. If Reading Time &lt;= 3, add a soft green highlight to the value. People follow color faster than policy. Your view becomes a traffic signal, not a spreadsheet.</p><p>Now remove friction with Quick Steps and Automate. Build a &#8220;Move to Root&#8221; step for promoting files out of the responses folder in one click. Create &#8220;Set Status: Needs Review,&#8221; &#8220;Set Status: Reviewed,&#8221; and &#8220;Set Status: Ready&#8221; steps so nobody hunts columns. Couple that with a lightweight notification flow&#8212;when Status flips to Reviewed &amp; Ready, ping the owner in Teams and post a link to the audio overview, if you generated one. One click, one status, one signal.</p><p>Governance hygiene is not optional. Use content types only where they add value&#8212;distinct schemas for true differences like Policies versus Invoices. Don&#8217;t wallpaper everything with bespoke types because you&#8217;re bored. Keep naming conventions boring and descriptive: {Category} &#8212; {Short Title} &#8212; {YYYY&#8209;MM}. Folders? Minimal. Use them for stable boundaries like Archive or Published, and let metadata do the rest. You&#8217;re building a system, not a nesting doll.</p><p>Train micro&#8209;habits that stick. Right&#8209;click for commands&#8212;faster than the ribbon scavenger hunt. Save your view changes or don&#8217;t touch them; the &#8220;Unsaved changes&#8221; cue exists for a reason. Use filter pills every single time you&#8217;re slicing; hover to confirm what&#8217;s applied, clear with one click. And don&#8217;t fight the form. If someone insists on bypassing it, they volunteer for manual triage duty. Consequences are a teaching tool.</p><p>Measure adoption so you iterate like adults. Track view usage&#8212;if &#8220;Needs Review&#8221; isn&#8217;t getting traffic, your reviewers are freelancing. Look at Autofill success rates and failure patterns; refine prompts where failures cluster. Monitor Copilot queries inside the library; if everyone asks the same question, surface it as a column or add it to the default view. Small telemetry, big leverage.</p><p>Here&#8217;s your weekly operating cadence. Monday to Thursday: ten&#8209;minute triage in &#8220;New Submissions,&#8221; promote with Quick Steps, run Compare Files on duplicates, paste abstracts, set status. Friday: review Autofill activity, fix prompts, re&#8209;run on stragglers, and prune the responses folder. Monthly: audit views, retire the ones nobody uses, and tighten conditional formatting to match current priorities. Continuous delivery, but for documents.</p><p>Two failure patterns to preempt. First, views drift because everyone tinkers. Solution: lock defaults, publish named views, and restrict edit rights to the librarians. Second, response folders sprawl into purgatory. Solution: scheduled triage plus Quick Steps that make the right move the fastest move.</p><p>You now have an operating system for documents&#8212;clear intake, automatic enrichment, visible triage, decisive approvals, and painless publishing. Not heroic. Just disciplined. Next, the two classic pitfalls that quietly wreck this model and the pro fixes you&#8217;ll apply before they bite.</p><h2>Common Pitfalls and Pro Fixes</h2><p>Pitfall: collecting too much in the form. You asked for Title, Abstract, Category, Sub&#8209;category, three dates, and someone&#8217;s favorite color. Users bail or lie. Pro fix: defer to Autofill. Require only the human decisions&#8212;Owner, Status, maybe Sensitivity. Everything else gets inferred, then reviewed. Shorter forms mean more submissions and better data.</p><p>Pitfall: unsaved view tweaks confusing everyone. One person drags a column, another groups by Category, and suddenly the library &#8220;lost files.&#8221; Pro fix: name and publish views with intention&#8212;&#8220;New Submissions,&#8221; &#8220;Needs Review,&#8221; &#8220;Reviewed &amp; Ready,&#8221; &#8220;By Category.&#8221; Lock defaults, restrict who can edit views, and teach the &#8220;Unsaved changes&#8221; cue as gospel. Private tinkering stays private.</p><p>Pitfall: vague Autofill prompts. &#8220;Write a summary&#8221; produces a haiku on Monday and a novella on Tuesday. Pro fix: example&#8209;led, format&#8209;specific instructions with guardrails. &#8220;One sentence, max 25 words; declarative; no colons.&#8221; For dates, &#8220;Return ISO YYYY&#8209;MM&#8209;DD.&#8221; For categories, &#8220;Choose exactly one from [Marketing, Research, Finance, Operations].&#8221; Test against messy docs before you scale.</p><p>Pitfall: letting response folders sprawl. Intake lands, nobody triages, and the folder becomes a museum of good intentions. Pro fix: scheduled triage plus Quick Steps. Daily ten&#8209;minute pass, &#8220;Move to Root,&#8221; set Status, run Compare on suspected duplicates, paste Abstract, and delete the loser. Make the right action one click faster than procrastination.</p><p>Pitfall: treating Copilot as gospel. It&#8217;s an assistant, not an auditor. Pro fix: spot&#8209;check high&#8209;impact answers and keep sources visible. Ask specific questions&#8212;&#8220;List five 2024 policy changes with section references&#8221;&#8212;then click citations. Two minutes of verification beats two weeks of cleanup.</p><p>Pitfall: ignoring filter pills. People swear files disappeared when, in fact, they filtered them out yesterday. Pro fix: day&#8209;one training on hover&#8209;to&#8209;see filters and the clear&#8209;all behavior. Add a tiny &#8220;Filters active&#8221; note in your team SOPs. State visibility kills paranoia.</p><p>Rapid checklist&#8212;the five switches to flip today for visible results in a week:</p><ol><li><p>Publish &#8220;New Submissions,&#8221; &#8220;Needs Review&#8221; sorted by Reading Time, and &#8220;Reviewed &amp; Ready&#8221; grouped by Category.</p></li><li><p>Strip your form to Owner, Status, Category; branch the rest; enable notifications.</p></li><li><p>Enable Autofill for Abstract, Category, Reading Time with strict formats; calibrate on ten files.</p></li><li><p>Create Quick Steps: Move to Root; Set Status: Needs Review; Set Status: Reviewed &amp; Ready.</p></li><li><p>Run Copilot Compare on suspected duplicates; paste the best abstract into the column; archive the extra.</p></li></ol><p>The truth? Most failures are self&#8209;inflicted&#8212;too many required fields, sloppy prompts, undisciplined views, and magical thinking about AI. Apply the pro fixes, and your library behaves like a system, not a rumor.</p><h2>Conclusion &#8211; Key Takeaway + CTA</h2><p>Key takeaway: Doc Libs aren&#8217;t storage anymore&#8212;they&#8217;re an intelligent workflow when you combine the new UX, Forms, Autofill, and Copilot into a single intake&#8209;to&#8209;publish pipeline.</p><p>Implement the pipeline this week: ship the four views, trim the form, enable Autofill, add Quick Steps, and run Copilot Compare on duplicates. Then watch our deep&#8209;dive on advanced Autofill prompts to lock formats and handle edge cases. If this saved you time, repay the debt: subscribe, enable notifications, and catch the next upgrade on schedule. Efficiency is a choice&#8212;make it now.</p>]]></content:encoded></item><item><title><![CDATA[The Microsoft 365 Agent SDK Is Not Optional]]></title><description><![CDATA[Opening &#8211; Hook + Teaching Promise]]></description><link>https://newsletter.m365.show/p/the-microsoft-365-agent-sdk-is-not</link><guid isPermaLink="false">https://newsletter.m365.show/p/the-microsoft-365-agent-sdk-is-not</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Thu, 20 Nov 2025 05:00:43 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176782411/c5baf02ecb4722b0d143c065e6e4b9d1.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Opening &#8211; Hook + Teaching Promise </h2><p>You&#8217;re building custom AI agents for Microsoft 365 the hard way. That&#8217;s why they break, stall, and fail security review the moment a real user shows up. The truth? The Microsoft 365 Agent SDK isn&#8217;t optional if you want scale, security, and real multi-channel reach.</p><p>You&#8217;ll learn why custom glue fails, what the SDK gives you out-of-the-box, and exactly how to implement it today. There&#8217;s one capability that quietly kills most DIY agents&#8212;I&#8217;ll reveal it before the end. Immediate payoff: you&#8217;ll leave with a deployable blueprint you can defend to security, ship to Teams, and wire to Copilot. Now let&#8217;s dismantle the common DIY approach&#8212;quickly.</p><h2>Why DIY Agents Fail in M365 Ecosystems </h2><p>You&#8217;re treating identity like a checkbox. Acting as &#8220;an app&#8221; when the action must be &#8220;as the user&#8221; destroys permission fidelity, nukes audit trails, and guarantees a failed review. In M365, access is identity-bound&#8212;files, chats, calendars, mail. If your agent uses a blanket service principal, it either over-privileges or gets blocked. And when auditors ask, &#8220;Who accessed this SharePoint file and why?&#8221; your logs shrug. That&#8217;s not governance; that&#8217;s guesswork.</p><p>Now here&#8217;s where most people mess up: state. You prototype on a laptop, it works once, then you scale to multiple nodes and your multi-turn logic collapses. Without shared conversation and turn state across instances, clarifications vanish, tool outputs drift, and the agent repeats itself like a goldfish with amnesia. Under load, stateless hacks become user-visible bugs: missing context, contradictory answers, and &#8220;sorry, what were we talking about?&#8221; energy.</p><p>Channel chaos is next. Teams, web chat, Slack, Outlook&#8212;each speaks a different dialect. Typing indicators, attachments, cards, streaming&#8212;none of it is consistent. You hand-roll adapters, it &#8220;mostly works,&#8221; until Teams expects activity protocol semantics your adapter never heard of. The result: broken messages, no streaming where users expect it, and inconsistent behavior that feels cheap. Users don&#8217;t care about your adapter. They care that the agent behaves like a native citizen everywhere.</p><p>Governance cliff: custom bots ignore Purview signals, skip DLP enforcement, and produce responses no one can eDiscover. Security says &#8220;no&#8221; because they must. If your agent can&#8217;t respect sensitivity labels, retention, and legal hold, it&#8217;s dead on arrival. The thing most people miss is that governance isn&#8217;t a feature you add later; it&#8217;s the ground you&#8217;re standing on. Build without it and the floor gives way.</p><p>Orchestrator sprawl adds entropy. A little LangChain here, a bit of Semantic Kernel there, plus bespoke tools duct-taped to HTTP calls. No standard execution plan. No uniform retries. Observability turns into a murder mystery with too many suspects and no timeline. Swap a model or a planner and you&#8217;re rewriting the agent, not swapping a part. That&#8217;s fragility disguised as flexibility.</p><p>Compliance gap: data residency, retention policies, and RBAC don&#8217;t magically align themselves. External chats can leak internally if your routing ignores tenant boundaries. Cross-tenant scenarios? Enjoy the minefield. If your agent doesn&#8217;t inherit the org&#8217;s compliance posture, you&#8217;re inventing a parallel universe with incompatible laws. Spoiler alert: that universe never gets production approval.</p><p>Debugging despair is the payoff for all of that. Without a consistent dev tunnel, you&#8217;re juggling ngrok links and half-broken proxies. Without end-to-end traces, every failure looks like a ghost. And channel-aware streaming? If you don&#8217;t detect capability, you either fake streaming where it doesn&#8217;t exist or you deprive users where it does. Both feel wrong. Both bleed trust.</p><p>The truth? DIY in M365 usually means you rebuilt plumbing with garden hoses. You&#8217;re busy fighting water pressure when you should be designing the brain. Enter the Microsoft 365 Agent SDK&#8212;the boring, standardized arteries that keep the system alive so you can focus on cognition. It handles identity properly, persists state across nodes, speaks the activity protocol with real adapters, and respects governance by default. And yes, it&#8217;s model-agnostic, so your orchestrator drama stops being everyone else&#8217;s problem. Once you nail the foundation, everything else clicks.</p><h2>What the Microsoft 365 Agent SDK Actually Provides (Model-Agnostic Core)</h2><p>Authentication done right, first. The SDK bakes identity into the activity flow so your agent can act-as-user when it should, and fall back to service credentials when it must. You get sign-in handlers that surface a clean consent moment, exchange codes for tokens, and hydrate the turn with user-scoped access&#8212;Graph, SharePoint, Outlook&#8212;tied to the actual human. The benefit is obvious: permission fidelity, real audit trails, and least-privilege by default. The thing most people miss is how this unlocks approvals and actions that a faceless app can&#8217;t perform without overprivileging. It&#8217;s not just auth; it&#8217;s authorization with a conscience.</p><p>Conversation management next. The SDK gives you durable session and thread state that survives across clustered nodes. Turn state, shared storage patterns, and consistent correlation IDs mean multi-turn doesn&#8217;t fall apart when a load balancer flips you to another instance. Clarifications, tool outputs, and short-term memory persist without you inventing your own sticky-session voodoo. The reason this works is the framework treats &#8220;conversation&#8221; as a first-class resource. Your agent stops repeating itself and starts behaving like it knows you&#8212;because it does, across turns, channels, and machines.</p><p>Enter the activity protocol. Think of it as the common language for agents&#8212;types for messages, events, typing, attachments, adaptive cards&#8212;so your logic isn&#8217;t hardwired to a single channel&#8217;s quirks. The SDK ships adapters for Teams, web chat, Slack, and Copilot Studio, translating their dialects into the activity model and back out again. Compare that to bespoke adapters that always miss an edge case: mention entities, file consent flows, live cards. Here, those semantics are standardized, so your agent feels native in every room it enters.</p><p>Orchestrator neutrality is where your future self thanks you. Plug Semantic Kernel, Azure AI Foundry planners, OpenAI, or your homegrown stack behind a clean interface. Prompts and tools live in modular units, not smeared across handlers. Swap a model, change a planner, run A/B without collapsing your agent. The SDK doesn&#8217;t pick winners; it enforces seams so you can. If you remember nothing else: isolate cognition from communication, and upgrades stop being rewrites.</p><p>Streaming awareness matters because user experience is trust. The SDK detects channel capabilities automatically. If the client supports token streaming, you stream&#8212;fast-first feedback, partial reasoning, adaptive card finalization. If it doesn&#8217;t, you fall back gracefully to typing indicators and chunked messages. No &#8220;fake streaming&#8221; hacks, no dead-air anxiety. And yes, the same logic covers attachments, cards, and suggested actions per channel capability without copy-paste conditionals sprinkled through your code.</p><p>Toolkit integration is the boring productivity you actually need. Visual Studio and VS Code scaffolding spins up an agent with a working echo &#8220;dial tone,&#8221; dev tunnels expose it safely for real channel testing, and diagnostics give you end-to-end traces&#8212;request headers, tokens present or absent, activities in and out. The playground simulates multiple channels so you can see capability differences without running six apps. Telemetry hooks emit correlation IDs and timing so you can spot latency in tools vs model calls vs channel I/O. This is how you debug in hours, not in folklore.</p><p>And since you&#8217;re about to ask: it&#8217;s open-source and free. The SDK costs $. You pay for downstream services&#8212;the models, search, storage&#8212;you choose. That means you inherit enterprise plumbing without surrendering control of your stack. Prefer Python this month and C# for production? Supported. Want to pilot OpenAI, then standardize on Azure AI Foundry with task adherence and security evaluations? Swap the orchestrator; keep the agent.</p><p>The truth? The SDK standardizes identity, state, protocol, and delivery so your code can focus on reasoning and tools. It&#8217;s model-agnostic by design, channel-aware by default, and governance-friendly out of the box. Great features are cute. These are survival traits. Now that you know what you get, let&#8217;s talk about how to wire it together so it ships and survives first contact with real users.</p><h2>Implementation Blueprint: From Zero to Multi-Channel Agent</h2><p>Start with scaffolding. Create a new Microsoft 365 Agent project with the Echo template. That&#8217;s your dial tone: a guaranteed &#8220;lights on&#8221; signal that channel wiring and activity flow are alive. Run it locally and open the playground. Send a message. If you don&#8217;t get a response here, stop. Fix environment variables, ports, and credentials before adding any &#8220;intelligence.&#8221; Average users skip this and then blame the model. Don&#8217;t be average.</p><p>Now route handlers. Add a join handler to greet users and a message handler to process input. Filter by activity type first&#8212;message, conversation update, invoke&#8212;and only then by content. Keep filters declarative and narrow. You&#8217;ll also wire a sign&#8209;in handler. That&#8217;s where the SDK surfaces consent, exchanges codes for tokens, and hands you a user-scoped access token on the turn. The benefit? You can call Microsoft Graph as the user without turning your bot into an overprivileged service principal. Yes, that&#8217;s the grown&#8209;up way.</p><p>Orchestrator plug&#8209;in next. Register your orchestrator&#8212;Semantic Kernel, Azure AI Foundry, OpenAI&#8212;through the SDK&#8217;s service collection. Separate prompts and tools from handlers. Prompts live in files, tools live as functions with explicit inputs and outputs, and both are unit&#8209;testable without channels. The shortcut nobody teaches: wrap model calls behind an interface. Today it&#8217;s a chat completion; tomorrow it&#8217;s a planner. The agent shouldn&#8217;t care. Your future migrations will thank you.</p><p>State management is where the toy becomes a system. Use turn state to persist chat history, tool outputs, and any short&#8209;term memory you need for multi&#8209;turn logic. Store correlation IDs so you can trace a single user journey across nodes. The thing most people miss is cross&#8209;node resilience: your load balancer will move a conversation midstream. Without shared state, clarifications evaporate and your agent stutters. With the SDK&#8217;s state patterns, it doesn&#8217;t.</p><p>Channel registration is where you stop being a lab project. Register your agent with Azure Bot Service as the persistent broker. ABS terminates channel protocols and forwards activities to your single endpoint. Point Teams, web chat, and Copilot Studio at that ABS endpoint. One endpoint, many channels, consistent semantics. Compare that to custom sockets per channel&#8212;brittle, unobservable, and guaranteed to fail during scale testing.</p><p>Flip the streaming switch. Enable streaming responses in the SDK. The agent will auto&#8209;detect channel capabilities. If streaming is supported&#8212;Teams, playground&#8212;you&#8217;ll stream tokens and give instant feedback. If not&#8212;some web clients&#8212;you&#8217;ll see typing indicators and chunked sends. You don&#8217;t branch your code per channel; the adapter does the civilized thing. Fast&#8209;first feedback reduces abandonment. And yes, you can finalize with an adaptive card without faking anything.</p><p>Diagnostics aren&#8217;t optional. Use the playground to simulate multiple channels. Inspect headers, confirm tokens are present when you expect act&#8209;as&#8209;user, and trace activities end&#8209;to&#8209;end. Turn on telemetry. Emit correlation IDs from message receipt to model call to tool invocation to response. The truth? Without correlation, you&#8217;re guessing. With it, you can prove whether lag lives in the model, your tool, or the network.</p><p>Time to wire a simple capability end&#8209;to&#8209;end. In your message handler, parse intent lightly&#8212;no heroics, just enough to route. Call your orchestrator with a system prompt that sets constraints and a user message that includes prior turn state. If the model plans to call a tool, execute the tool with user&#8209;scoped tokens when the action is Graph&#8209;bound, or service credentials when it&#8217;s external and safe. Write the tool result to turn state. Stream partial text if supported. When complete, render a final adaptive card with the structured output.</p><p>Add guardrails. Scope tools by role and data sensitivity. A planner can propose calls; your agent authorizes them. That means verifying audience, labels, and action limits before execution. If a tool wants to send mail, require explicit user confirmation. If a tool wants SharePoint data, check sensitivity labels and respect DLP. You are not a genie; you&#8217;re an agent with boundaries.</p><p>Deploy a minimal slice. Echo works? Good. Add one tool and one prompt. Exercise in playground, web chat, and Teams via ABS. Verify streaming where supported. Verify act&#8209;as&#8209;user flows and audit entries. Bake these checks into your definition of done. Only then add more tools, more prompts, and richer reasoning.</p><p>Finally, package repeatability. Create scripts that provision the ABS resource, register channels, configure app IDs, and set environment variables. Commit your prompt files, state schema, and tool interfaces. The outcome is simple: a multi&#8209;channel, stateful, identity&#8209;correct agent that debugs cleanly and survives load. Now we can talk about security gates, because that&#8217;s the door you actually have to open.</p><h2>Security, Compliance, and Governance: Why the SDK Is Non&#8209;Optional</h2><p>You don&#8217;t pass enterprise gates by vibes. You pass with identity, auditability, and enforceable policy. The SDK hardwires those into your agent so you stop negotiating with security and start inheriting their controls.</p><p>Start with Entra identity for agents. It&#8217;s not &#8220;some app registration.&#8221; It&#8217;s a unified identity model where the agent has its own persona, can act-as-user with explicit consent, and leaves an audit trail that maps every action to a principal. Acting as the user means permission fidelity&#8212;Mail, Calendar, SharePoint, Teams&#8212;exactly what that human can do, nothing more. Least privilege isn&#8217;t a slogan here; it&#8217;s how tokens are minted and scoped on every turn. When compliance asks, &#8220;Who accessed this file, under whose authority, and when?&#8221; you have a deterministic answer because the SDK threads that identity through the activity flow.</p><p>Now, Purview integration. This is where most DIY builds fall off a cliff. Prompts and responses are content. Content has labels, retention, and legal obligations. Purview-enforced classification and DLP can evaluate AI inputs and outputs in real time&#8212;blocking sensitive leaks, honoring sensitivity labels, and ensuring generated text doesn&#8217;t violate policy. eDiscovery alignment means your agent&#8217;s conversations and artifacts can be discovered, placed on legal hold, and exported under the exact same controls as mail and documents. The thing most people miss is that Purview isn&#8217;t a bolt-on. In the Microsoft estate, it&#8217;s the nervous system. The SDK routes signals so labels, retention, and access decisions apply without you writing bespoke regex filters that break on day two.</p><p>Enter Defender for Cloud with AI-aware detections. Yes, jailbreaks, prompt injections, and data exfil aren&#8217;t hypotheticals; they&#8217;re Tuesday. Defender provides posture recommendations and runtime alerts tailored to agentic systems. That means you get telemetry that recognizes suspicious tool invocation patterns, anomalous output spikes, and token misuse, backed by threat intelligence you&#8217;ll never reproduce in-house. DIY security engineering pretends it can watch everything; the SDK taps the existing watchtowers that already monitor your tenant.</p><p>Zero Trust for agents isn&#8217;t a presentation slide; it&#8217;s the operating mode. Identity-bound actions, scope-limited tools, and task adherence checks in Azure AI Foundry constrain the agent&#8217;s behavior. A planner can suggest an action; your policy decides if the agent may execute it, for whom, and with which token. Tools operate inside permission envelopes: read-only where required, explicit confirmation gates for risky operations, and hard blocks against crossing tenants or labels. The reason this works is simple: tokens are the authority, and the SDK controls when and how they&#8217;re issued and used.</p><p>Compliance automation is where you save calendar quarters. Retention policies apply to conversations. Audit logs capture who did what, when, and through which channel. Legal hold can freeze relevant interactions without you inventing a parallel archive. You&#8217;re not rebuilding controls; you&#8217;re inheriting them. Compare that to custom agents that dump logs into a table and call it &#8220;compliant.&#8221; Your auditors won&#8217;t be charmed by JSON.</p><p>The risk delta versus custom is not subtle. DIY means months of designing identity flows, writing token exchangers, bolting on content scanning, inventing redaction rules, and trying to map outputs to eDiscovery. Then you spend more months proving to security that it works under load, across channels, and in adversarial scenarios. With the SDK, you start with defaults that mirror the Microsoft 365 security posture you already run. Day one, you have traceability, policy enforcement, and channel-aware activity semantics that pass the first sniff test. The difference is the inheritance model: your agent lives inside the enterprise guardrails instead of oscillating just outside them.</p><p>Governance at scale is where projects either become platforms or die. Centralized admin control gives IT a single place to see agents, manage identities, rotate secrets, and apply policies. Approval flows can gate new tools, new channels, and new scopes. Policy inheritance means if your org tightens DLP or revises retention, your agent adapts without a refactor. Org-wide visibility&#8212;across Teams, web, and Copilot&#8212;lets you answer the only question executives care about: &#8220;What are these agents doing in our tenant?&#8221; With SDK telemetry, you can correlate channel events, agent steps, and model calls under one roof, and you can redact sensitive fragments before logs leave the enclave.</p><p>Before we continue, you need to understand the political reality. Security never says &#8220;yes&#8221; to bespoke AI systems that can&#8217;t prove identity fidelity, content governance, and operational observability from day one. They&#8217;ll stall you, and they&#8217;ll be right. The SDK isn&#8217;t optional because it converts those debates into configuration. You wire sign-in handlers; you inherit least privilege. You register through Azure Bot Service; you inherit channel controls. You surface content via the activity protocol; Purview and DLP can see and act on it. You don&#8217;t plead your case; you demonstrate it.</p><p>If you remember nothing else: identity, content protection, and threat monitoring must be first-class citizens in your agent. The SDK makes them boring and automatic. Your custom code should focus on reasoning and tools, not reinventing compliance. Now, let&#8217;s talk about the ways teams still sabotage themselves and how to avoid that slow-motion disaster.</p><h2>Common Pitfalls and How to Avoid Them</h2><p>Building your own channel adapters is the fastest way to reinvent the wheel&#8230; as a triangle. The activity protocol already defines messages, events, typing, attachments, and cards. Use the SDK adapters for Teams, web chat, Slack, and Copilot Studio. You&#8217;ll get consistent semantics, file consent flows, and capability detection without a whack&#8209;a&#8209;mole backlog of edge cases you&#8217;ll never finish.</p><p>Treating agents as stateless is next-level sabotage. Multi&#8209;turn requires memory. Persist conversation threads and turn state using the SDK patterns so clarifications, tool results, and correlation IDs survive failover and load balancing. The truth? Without shared state, your &#8220;smart&#8221; agent develops retrograde amnesia every time traffic spikes.</p><p>Hardcoding model logic into handlers glues cognition to transport. Isolate prompts and tools behind interfaces the SDK can register. That way you can swap Semantic Kernel for Azure AI Foundry planners, test OpenAI vs another provider, or A/B system prompts without ripping out your routing and state code. Upgrades should feel like changing a blade, not disassembling the plane mid&#8209;flight.</p><p>Skipping user auth and running everything as a service principal flattens permissions and kills auditability. Implement sign&#8209;in handlers so your agent can act&#8209;as&#8209;user when touching Graph&#8209;bound assets, and only fall back to app tokens for non&#8209;user operations. You&#8217;ll pass least&#8209;privilege checks and finally answer, &#8220;Who did what, when, and under whose authority?&#8221;</p><p>Ignoring streaming semantics produces a UI that feels laggy and amateur. Enable streaming in the SDK so channels that support it show real&#8209;time progress, and channels that don&#8217;t gracefully show typing indicators and chunked sends. Don&#8217;t fake streaming. Users notice, and trust evaporates.</p><p>Bypassing Azure Bot Service to wire direct sockets per channel multiplies failure modes. ABS is the persistent broker that terminates protocols, normalizes activities, and points many channels to one endpoint. Use it. Your ops team will thank you when messages route reliably during scale tests instead of vanishing into bespoke socket purgatory.</p><p>No governance story equals shadow agents. Register identities, apply Purview and DLP policies, and light up audit logs from day one. If your compliance team can&#8217;t eDiscover conversations or see label enforcement on outputs, your rollout is already over. The game&#8209;changer nobody talks about is that governance isn&#8217;t &#8220;later.&#8221; It&#8217;s the door to production.</p><p>Now, here&#8217;s the checklist you actually run: use SDK adapters, persist state, abstract cognition, implement sign&#8209;in, enable streaming, register through ABS, and wire Purview/DLP. Do that, and the common traps stop being your traps.</p><h2>Advanced Patterns: Scale, Extensibility, and Real Enterprise Use</h2><p>Tool catalogs are how you keep power without chaos. Define tools with scopes, roles, and data sensitivity tiers. A planner proposes; your policy approves based on audience, label, and action. Map &#8220;read calendar&#8221; to most users, &#8220;send mail&#8221; to owners with explicit confirmation, and &#8220;export records&#8221; to admins only. Tools live in a registry; the agent never free&#8209;ranges.</p><p>Skill composition moves you beyond single&#8209;turn party tricks. Use planner&#8209;led sequences with retries and circuit breakers at the orchestrator edge. External tools fail; that&#8217;s their hobby. Wrap them with idempotent designs and exponential backoff. Keep chain&#8209;of&#8209;thought private; return summarized rationale, not raw reasoning. You want transparency, not prompt&#8209;leak therapy.</p><p>Cross&#8209;tenant exposure demands paranoia with instrumentation. For unauthenticated or B2B scenarios, run monitored sessions with rate limits, content classification, and Purview oversight on inputs and outputs. Identity gates actions; anonymous sessions read public docs, not private mail. Every external turn emits auditable events or it doesn&#8217;t ship.</p><p>Observability is non&#8209;negotiable. Correlate channel events, agent steps, model calls, and tool invocations with a single trace ID. Redact sensitive fragments at the edge before logs leave the enclave. Dashboards should answer three questions instantly: where time went, where errors originated, and who was authorized to do what. If you can&#8217;t see it, you can&#8217;t scale it.</p><p>Migration from TeamsFx? There&#8217;s a path. Start by fronting your existing bot with ABS if it isn&#8217;t already. Incrementally replace custom adapters with SDK adapters, move state into SDK turn/state patterns, and isolate cognition behind interfaces. Use SDK templates to stand up parallel routes and switch traffic gradually. The deprecation clock won&#8217;t wait; your refactor plan shouldn&#8217;t either.</p><p>Cost governance matters when your CFO learns what &#8220;context window&#8221; costs. Cache embeddings, dedupe retrieval, and reuse short&#8209;term context across turns. Throttle tool calls with backoff, and cap generations with sane token budgets per intent. The shortcut nobody teaches: classify requests early and route &#8220;FAQ&#8209;grade&#8221; prompts to cheaper models without touching premium planners.</p><p>Resilience under load is design, not luck. Use session stickiness where available, but assume you&#8217;ll switch nodes mid&#8209;turn; that&#8217;s why state lives outside process. Make tools idempotent with request IDs so retries don&#8217;t double&#8209;charge credit cards or resend emails. Concurrency guards stop two turns from stomping the same resource. Tests should simulate bursty traffic, partial outages, and slow dependencies&#8212;because production will.</p><p>Once you nail catalogs, composition, cross&#8209;tenant controls, observability, migration hygiene, cost levers, and resilience, your agent stops being a demo and becomes infrastructure. And yes, this is exactly where the SDK earns its keep: standardized identity, state, protocol, and channel semantics so your advanced patterns sit on bedrock, not on vibes.</p><h2>The Silent Killer: State, Identity, and Channel Semantics </h2><p>You can fake prompts; you can&#8217;t fake identity-bound actions under load across channels. Without user-scoped tokens, your agent either overreaches or gets blocked&#8212;and your audit trail goes blind. Without shared conversation state, multi-turn logic fractures the moment a load balancer does its job. Without channel-aware delivery, streaming, cards, and typing semantics degrade into random behavior. The SDK solves these three constraints by design: act-as-user with auditability, persist multi-turn across nodes, and adapt to channel capabilities automatically. That&#8217;s the piece everyone misses while hand&#8209;wiring LLM calls. Ship cognition on bedrock, not on vibes, or production will teach you the lesson expensively.</p><h2>Conclusion &#8211; Takeaway + CTA</h2><p>Key takeaway: in M365, security, identity fidelity, and multi-channel behavior aren&#8217;t features&#8212;they&#8217;re the table stakes the Agent SDK delivers by default. Next step: scaffold an agent, wire sign&#8209;in handlers for act&#8209;as&#8209;user, register with Azure Bot Service, and light up Teams and Copilot with streaming enabled and state persisted. If this made you faster and safer, subscribe. Listen the next podcast on Purview&#8209;enforced AI guardrails so your outputs respect labels, DLP, and eDiscovery from day one. Your compliance team won&#8217;t just stop saying no&#8212;they&#8217;ll start approving. Do the efficient thing now. Proceed.</p>]]></content:encoded></item><item><title><![CDATA[The 3 Ways Microsoft Hides Pixel-Perfect Reports]]></title><description><![CDATA[Opening Hook + Teaching Promise]]></description><link>https://newsletter.m365.show/p/the-3-ways-microsoft-hides-pixel</link><guid isPermaLink="false">https://newsletter.m365.show/p/the-3-ways-microsoft-hides-pixel</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Wed, 19 Nov 2025 17:54:29 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176782173/fd92f24cac588230a1880a0ed4a7f3b0.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Opening Hook + Teaching Promise </h2><p>You tried printing a gorgeous Power BI dashboard and got a pixelated, multi&#8209;page mess that looked like it fell down a flight of stairs. The truth? Power BI visuals aren&#8217;t built for paper. Paginated Reports are. Microsoft hides pixel&#8209;perfect output behind three different tools, each with trade&#8209;offs the average user blissfully ignores. In the next minutes, you&#8217;ll learn the three ways, when to use each, and how to avoid costly dead ends. Stay for a 30&#8209;second decision matrix and one shortcut that saves hours. Now let&#8217;s expose where each option lives&#8212;and why the average user keeps picking the wrong door.</p><h2>Context: Why Paginated Reports Exist (and Power BI Isn&#8217;t It) </h2><p>Executives want fixed layouts. Headers that repeat on every page. Page numbers that don&#8217;t lie. Legal disclaimers that never wander off the margin. They want what auditors want: the same output, every time, regardless of screen size, browser zoom, or printer mood swings. That&#8217;s not a dashboard problem. That&#8217;s a print problem.</p><p>Paginated Reports exist for that exact use case. They&#8217;re RDL&#8209;based&#8212;Report Definition Language&#8212;meaning print&#8209;first design, not a playground for slicers. It&#8217;s not just a &#8220;different file.&#8221; It&#8217;s a different philosophy. Interactive dashboards adapt fluidly; paginated reports control every pixel like a fussy stage manager with a ruler.</p><p>Here&#8217;s how they fit: you connect an RDL report to a Power BI semantic model&#8212;yes, the same data model feeding your dashboards&#8212;and the report engine renders pages with strict layout control. You define paper size, margins, headers, footers, groups, and page breaks. The engine obeys. No mystery, no &#8220;responsive&#8221; surprises.</p><p>Consequences of forcing dashboards to print? You waste time hacking column widths, then cry when a slicer reflows and your totals jump to page three. &#8220;Export to PDF&#8221; from Power BI is not pagination; it&#8217;s a screenshot with delusions of grandeur. The moment you need repeating headers, grouped totals, or a thousand&#8209;row list across clean pages, you&#8217;re in paginated territory whether you admit it or not.</p><p>Benefits are obvious once you stop resisting: precise pagination, reliable headers and footers, and export&#8209;ready formats like PDF and Word that hold their layout under pressure. You can do conditional visibility&#8212;show sections only when data exists&#8212;control widows and orphans, and print like an adult.</p><p>The quick win is painfully simple: decide early. Dashboards are for screens; paginated is for paper. If the primary output goes to a printer, jump tools before you waste a sprint polishing a dashboard that will always betray you in the copy room. With the stakes set, here&#8217;s door number one&#8212;the deceptively easy option that seduces the average user because it lives in a browser and promises zero friction.</p><h2>Way 1 &#8212; Power BI Service (Web Paginated Builder): Fastest, Most Limited </h2><p>Why this exists is straightforward: zero install, any OS, and you can crank out a simple table or matrix with headers, footers, and page numbers before lunch. It&#8217;s the web&#8209;based paginated editor living right in the Power BI Service. Open a workspace, hit New, choose Paginated Report, point it at your semantic model, and you&#8217;re in. No downloads, no admin rights, no excuses.</p><p>What it does: it&#8217;s a basic RDL editor in the browser tied directly to a Power BI semantic model. You can add fields, define groups, drop in a logo, set a header and footer, and pick a page size like Letter or A4. It handles page numbers, current date, and simple text boxes without drama. Think &#8220;quick listing,&#8221; not &#8220;annual report.&#8221;</p><p>How to implement, step&#8209;by&#8209;step: go to your workspace, click New &#8594; Paginated report. Select the semantic model you already use for your dashboard; that way measures and security behave the same. Add a table, drag fields from your entities, set a group on something logical like Region or Category, then open the Page Setup to define paper size, margins, and orientation. Add a header with the title and parameter echoes, a footer with &#8220;Page X of Y,&#8221; and preview. If it spans too wide, reduce column widths or margins until the horizontal fit indicator stops complaining. Save. Share. Done.</p><p>Strengths? Accessibility and speed. It&#8217;s excellent for quick iterations, especially when you need to validate requirements with a business lead who&#8217;s allergic to software installs. Versioning and permissions live in the Service, so collaboration is immediate. And because you&#8217;re bound to a semantic model, Row&#8209;Level Security and DAX logic carry over neatly.</p><p>Limits, and they matter: it&#8217;s table/matrix&#8209;centric. Charts are sparse, maps are absent, and expression support is shallow compared to desktop tooling. Layout control is minimal, so complex conditional formatting, nested regions, and elaborate groupings will hit a wall. If you want precision control over page breaks between groups, you&#8217;ll feel the constraint quickly.</p><p>Use cases that actually fit: simple invoices, index&#8209;style listings, operational pick lists, or mail&#8209;merge&#8209;like summaries where the heavy lifting is &#8220;rows on paper&#8221; with a consistent masthead. Translation: you need it now, you don&#8217;t need fancy visuals, and nobody will require surgical control over typography next week.</p><p>Common mistakes the average user makes: treating this like full SSRS and expecting advanced features to magically appear. Ignoring margins and printable width, which leads to accidental horizontal overflow and surprise blank pages. Failing to learn basic field&#8209;level expressions&#8212;like concatenating a title or formatting numbers&#8212;so reports look amateur when a tiny expression would fix it. And anchoring too many columns because &#8220;we need everything,&#8221; which guarantees wrapping chaos.</p><p>Quick win you can deploy today: build a one&#8209;page prototype here before committing to deeper tooling. Use it as a live spec. Align on paper size, headers, footers, and grouping with your stakeholder. If they ask for charts, parameters, or conditional sections, you&#8217;ve just justified graduating to the desktop tool without arguing.</p><p>The trade&#8209;off is speed versus sophistication. This is perfect for validating structure, simple outputs, and short&#8209;term needs. But the minute requirements evolve&#8212;charts, multi&#8209;level groups, conditional visibility, advanced expressions&#8212;you&#8217;ll pay a migration tax. That&#8217;s fine, as long as you planned for it. If you didn&#8217;t, congratulations, you just built a cul&#8209;de&#8209;sac.</p><p>Now, when you hit those layout walls&#8212;and you will&#8212;you graduate to the real tool for analysts: the desktop authoring environment that gives you pixel control, robust expressions, and parameters without dragging you into full developer land.</p><h2>Way 2 &#8212; Power BI Report Builder: The Professional Print Shop </h2><p>Enter the tool that treats paper like a first-class citizen. Power BI Report Builder exists because business adults want print control, richer visuals, parameters, and expressions that don&#8217;t feel like they were added as an afterthought. You get charts, gauges, and maps; you get groups, nested regions, and page breaks that actually obey you. It&#8217;s the difference between doodling in a browser and walking into a proper print shop with rulers, templates, and a foreman who says, &#8220;No, that won&#8217;t fit. Fix it.&#8221;</p><p>Why this matters: when you&#8217;re producing board packs, financial statements, regulatory filings, or operational lists with strict headers, you can&#8217;t wing it. Executives expect the cover page to look like a cover page, the subtotal to land at the bottom of the group, and the page numbers to behave. Report Builder gives you the pixel-level control and the expression engine to make that happen&#8212;without dragging your entire team into full developer workflows.</p><p>What it actually does: it&#8217;s a full RDL authoring environment. You define page size, margins, and orientation up front. You design datasets against your Power BI semantic model, using the same measures and Row-Level Security your dashboards use. You build tables, matrices, and charts, and you wire up parameters so a CFO can switch months or regions without calling you. Then you set page breaks and visibility rules to keep sections clean. The engine renders exactly what you told it to render. No &#8220;responsive surprise.&#8221;</p><p>Let me show you exactly how to implement it, step by step. Install Report Builder. Open it. Connect to your Power BI semantic model&#8212;via the built-in connector&#8212;so you&#8217;re querying the same data model. In the Query Designer, select fields and measures; behind the scenes, it builds a DAX query over XMLA. Click OK; you now have a dataset. Drop a table, drag fields into detail, add a row group on something logical like Country, and a parent group on Region if you need hierarchy. Now, before you get excited, go to Page Setup and define paper size, margins, and orientation. This clicked for me when I realized: if you design before setting paper, you will chase width problems for hours. Don&#8217;t.</p><p>Once your canvas is honest about its size, add a header with your title, parameter echoes, and the run date. Add a footer with &#8220;Page X of Y.&#8221; Use consistent fonts. Now configure page breaks: set a page break between each Region group, and a separate break at the end of each Country group if needed. Preview. If you see orphaned group headers or subtotals wandering onto new pages alone, adjust &#8220;KeepTogether&#8221; and &#8220;Repeat header rows on each page&#8221; in the tablix properties. The truth? The thing most people miss is printable width. Your page width minus margins defines a hard limit; exceed it and you&#8217;ll get phantom blank pages. Respect the math.</p><p>Strengths you actually feel: pixel control is precise. Expressions are powerful&#8212;build dynamic titles like &#8220;Sales by Region for @Month,&#8221; hide sections when totals are zero, color exceptions when thresholds are breached. Parameters are native, so you can build a clean prompt experience. You can nest data regions, add conditional visibility, and create repeatable templates so every report looks like it belongs to the same company rather than a ransom note.</p><p>Advanced tricks that separate beginners from pros: use grouping and sub-totals with explicit page breaks to produce clean book sections. Leverage Lookup and LookupSet when you need to enrich rows from another dataset without exploding cardinality. Use conditional formatting to highlight variances. Create shared datasets for common lists&#8212;like date ranges or entities&#8212;so you don&#8217;t duplicate logic across reports. And yes, maps and gauges exist for when leadership insists on shapes and needles.</p><p>Common mistakes&#8212;don&#8217;t do what the average user does. They don&#8217;t test pagination early. They design on a sprawling canvas, then discover page two is a blank artifact created by a .1-inch overflow. They ignore printable width. They over-nest tablixes until performance collapses. They forget that row-by-row expressions are evaluated for every row, so a cute string manipulation becomes a performance tax on 200,000 rows. And the classic: hammering Excel exports and wondering why the layout mutates&#8212;because Excel is cell-first, not print-first.</p><p>Performance notes, because you like your reports to finish before quarter-end. Push aggregation into the semantic model&#8212;measures and summarized queries return fewer rows. Control dataset granularity: don&#8217;t bring a million-detail rows if the output is grouped by month. Avoid row-by-row custom code. If you must do heavy logic, do it once at the group level or as a calculated column upstream.</p><p>Export nuances: PDF preserves layout faithfully. Word preserves structure but can reflow if editors poke at it&#8212;still fine for distribution. Excel is for data work, not pixel worship; it will translate regions into cells, which is great for analysis, less great for perfect spacing. Choose the export based on the recipient&#8217;s behavior, not your wishful thinking.</p><p>Publishing is straightforward: save the RDL, publish to the Service, bind parameters to default values, and test with real security. Manage credentials where needed. Then lock the template: standardized header, footer, fonts, and colors. Most business needs land here&#8212;enough power to deliver professional print outputs, without the overhead of a full developer solution. Once you nail this, everything else clicks.</p><h2>Way 3 &#8212; Visual Studio + SSRS Projects: Enterprise Control Room</h2><p>If Report Builder is a professional print shop, Visual Studio with Reporting Services Projects is the entire print factory&#8212;loading docks, conveyor belts, and a foreman who tracks everything in a clipboard and version control. This exists for one reason: solution&#8209;level management. Multiple RDLs. Shared data sources. Source control. CI/CD. In other words, the environment grown&#8209;up enterprises need when &#8220;a report&#8221; quietly turns into &#8220;a portfolio of reports with governance.&#8221;</p><p>What it actually does is give you a project and solution structure instead of single files floating around like unsupervised toddlers. You create a Reporting Services Project. Inside it, you define Shared Data Sources and Shared Datasets, then add as many RDLs as you like. Subreports? Native. Drill&#8209;through navigation across a suite? Easy. Complex expressions with centralized parameters? Routine. And because it&#8217;s Visual Studio, you get integration with Git or Azure DevOps for versioning, branching, and deployments that don&#8217;t depend on someone remembering which desktop had the &#8220;final_final_latest.rdl.&#8221;</p><p>Implementation, clean and simple: install Visual Studio&#8212;Community is fine. Add the Reporting Services Projects extension. Create a new Reporting Services Project. First, add Shared Data Sources that point to your Power BI semantic model endpoints or other governed stores. Then design Shared Datasets for common lists&#8212;Calendar, Entities, Parameters&#8212;so every report pulls from the same definitions. Add a new Report, set Page Setup for your corporate standard (Letter or A4, margins, portrait or landscape). Insert your company&#8217;s Base Report elements&#8212;header with logo, footer with &#8220;Page X of Y,&#8221; and brand fonts. Now you&#8217;re ready to build RDLs that look related because the assets they use are, in fact, shared.</p><p>Strengths you feel on day one: team workflows and reuse. Multiple developers can work on different RDLs in parallel, review each other&#8217;s changes, and avoid &#8220;overwrite roulette.&#8221; Shared assets eliminate drift&#8212;your date parameter behaves the same in twelve reports because it&#8217;s defined once. You also get advanced property control. Need a configurable deployment target? Create multiple configurations&#8212;Dev, Test, Prod&#8212;with different server URLs and data source bindings. Press Build. Deploy. No sneaker&#8209;net.</p><p>Enterprise patterns that shine here: master&#8209;detail with subreports to split big books into maintainable parts. Parameterized drill&#8209;through navigation from summary to detail across reports, passing context cleanly. Shared styles via report parts or templates to enforce consistent typography and spacing. Deployment profiles that map folders and permissions so your finance pack lands in Finance/Reports with the right role assignments every time. This is the difference between &#8220;we emailed a file&#8221; and &#8220;we ship a product.&#8221;</p><p>Use cases: enterprise packs that ship monthly, departmental suites covering the same dimensions with different filters, governed financials where auditability and consistency matter, and multi&#8209;region rollouts where the same report deploys to ten workspaces with environment&#8209;specific data sources. If you&#8217;re thinking in portfolios rather than one&#8209;offs, you&#8217;re in the right room.</p><p>Common mistakes when people wander in from Report Builder: treating the project like a folder of independent RDLs instead of engineering a modular solution. Not modularizing datasets, so every report rebuilds the same calendar list fifteen times. No naming conventions, which leads to &#8220;Report1_Final2&#8221; chaos. Skipping source control and losing history when someone &#8220;fixes&#8221; the template. And my favorite: hard&#8209;coding server paths or credentials, then wondering why deployments break the moment you change environments.</p><p>Quick win you can implement immediately: create a &#8220;Base Report&#8221; template RDL with your header, footer, margins, fonts, and common expressions, then clone it for every new report. Centralize a Shared Data Source to your semantic model and Shared Datasets for parameters. In one hour you eliminate 80% of drift and 100% of the &#8220;why does this one look different?&#8221; conversations.</p><p>Compatibility caveats you need to respect: some legacy SSRS visuals and custom fonts won&#8217;t render identically in the Power BI Service. Test early. If your design depends on a niche chart or font, confirm it in the target environment before you build an entire suite around it. And yes, PDF will be faithful; Excel will do Excel things because cells are not pages&#8212;manage expectations.</p><p>Governance matters here. Design a folder structure that mirrors your organization&#8212;by domain, not by author. Apply role&#8209;based access consistently. Map environments&#8212;Dev, Test, Prod&#8212;via deployment profiles so promoting a release is a button, not a scavenger hunt. Document naming conventions for reports, datasets, and parameters. The result is boring in the best way: predictable, traceable, and safe.</p><p>The trade&#8209;off is obvious: maximal control for maximal complexity. You get reusable assets, team workflows, and CI/CD, but you also inherit the ceremony&#8212;branches, reviews, build pipelines, training. For a single invoice, it&#8217;s overkill. For a governed suite that affects finance or operations? It&#8217;s the only adult option.</p><p>The truth? If your reporting footprint is growing, Visual Studio stops being &#8220;developer theater&#8221; and becomes the control room. You don&#8217;t just make reports&#8212;you ship a reporting product with standards, tests, and releases. And yes, the average user will complain it feels heavy. Correct. So is a seatbelt.</p><h2>Decision Matrix: Pick the Right Door in 30 Seconds </h2><p>You want fast, not fuzzy. Here&#8217;s the decision in plain English. If you need a simple tabular printout today&#8212;rows, a logo, page numbers&#8212;use the Service builder. It&#8217;s minutes, not meetings. If you need real page control, charts, and parameters, use Report Builder. It&#8217;s days, not drama. If you need suites with subreports, shared assets, and governance, use Visual Studio. It&#8217;s weeks, but it scales.</p><p>Budget and time lens: Service equals minutes. Report Builder equals a few focused days to nail layout, parameters, and exports. Visual Studio equals weeks to set up shared datasets, templates, and deployment profiles&#8212;then it pays you back on every release.</p><p>Skill lens: an analyst can survive in the Service with basic expressions. A power user thrives in Report Builder&#8212;comfortable with groups, page breaks, and DAX-backed datasets. A dev team or at least a disciplined analyst-dev hybrid should handle Visual Studio, because source control, profiles, and solution structure aren&#8217;t optional there.</p><p>Risk lens: evolving requirements punish the Service. It&#8217;s a trap if stakeholders &#8220;just want a list&#8221; until they inevitably ask for charts, conditional sections, and parameters. Enterprise risk punishes ad hoc Report Builder&#8212;one-off RDLs sprawl, styles drift, and deployment becomes folklore. If compliance, audit readiness, or broad reuse matters, you want Visual Studio&#8217;s shared assets and versioning.</p><p>Migration path that doesn&#8217;t hurt: prototype in the Service to lock paper size, header, footer, and grouping. Move to Report Builder when you need page control, expressions, and parameters. Productize in Visual Studio when you need multiple reports, shared datasets, and consistent deployment across environments. This is not rework; it&#8217;s staged investment.</p><p>Checklist before you publish anything: paper size and margins set, printable width respected, headers and footers repeating, parameters tested with ugly edge cases, and export formats verified&#8212;PDF for fidelity, Word for editable distribution, Excel only when analysis is the point. If any box is unchecked, you are shipping a support ticket.</p><p>Shortcut most people ignore: Analyze in Excel. For purely tabular, page-friendly outputs with light governance, connect Excel to the semantic model and print from a tool everyone already understands. It&#8217;s not a replacement for RDL, but it&#8217;s a pragmatic fast lane for lists.</p><p>Don&#8217;t do this: don&#8217;t jam a dashboard into a printer. Don&#8217;t skip page tests until the night before a board meeting. Don&#8217;t ignore dataset scope and then complain when exports crawl. Choose the door that matches the ask, not your mood.</p><h2>Technique Upgrades: Make Any Paginated Report Look Pro</h2><p>Start with the layout model. Define paper first&#8212;A4 or Letter, portrait or landscape&#8212;then design. Refuse to place a single control until the canvas matches the printer. Your width equals paper width minus margins; that number is nonnegotiable.</p><p>Typography next. Two fonts max: one for headings, one for body. Set consistent sizes, don&#8217;t improvise. Align numerics right, apply thousand separators, and fix decimal precision by measure type. Titles sentence case, labels concise. If you remember nothing else, consistency equals credibility.</p><p>Structure matters. Use groups for logical breaks&#8212;Region, then Country, then Store. Add explicit page breaks between major sections so cover pages don&#8217;t blend into detail. Turn on &#8220;Repeat header rows on each page&#8221; and &#8220;KeepTogether&#8221; thoughtfully to prevent orphaned headers and stray subtotals.</p><p>Expressions elevate everything. Dynamic titles with parameter echoes: &#8220;Sales by Region for @Month.&#8221; Conditional visibility: hide empty sections; show warnings when thresholds fail. Page X of Y and run date in the footer&#8212;standard. Use IIF sparingly and prefer clean expressions at the group level rather than row-by-row gymnastics.</p><p>Performance is a design choice. Aggregate in the semantic model so you query fewer rows. Reduce dataset granularity to what the layout actually prints. Avoid per-row custom code. If you must compute, do it once per group or upstream. Preview with realistic parameter selections, not tiny samples that lie.</p><p>Reusability is sanity. Build header, footer, and style templates. In Report Builder, save a starter RDL with fonts, margins, header/footer, and placeholder text. In Visual Studio, promote shared datasets and a base template. Use naming conventions&#8212;Rpt.Finance.MTD.Summary, Ds.Date.Calendar, Param.Region&#8212;to stop the &#8220;final_final&#8221; chaos.</p><p>Testing discipline separates pros from hopefuls. Preview with multiple parameters, including extremes: the most verbose region name, the densest month. Export to PDF and Word and check for layout drift. Scan for orphaned rows on page starts. Validate that conditional sections truly hide when empty and that totals don&#8217;t float.</p><p>Compliance isn&#8217;t decoration. Lock decimals to the policy, include legal disclaimers in the footer, and fix branding&#8212;logo size, padding, and colors&#8212;so marketing doesn&#8217;t chase you. If signatures or approval blocks are required, design space for them. And yes, test the exact printer if the output goes to a physical device that trims aggressively.</p><p>Quick win: build a one-page cover with KPIs&#8212;big numbers, sparkline or small chart&#8212;then drive detail pages via parameters or drill-through. Stakeholders get instant signal, auditors get detail, and nobody scrolls through ten pages to find the point.</p><h2>Conclusion + CTA</h2><p>Dashboards are for screens; paginated reports are for paper&#8212;choose the tool that matches the job and you stop fighting physics. Use the matrix: prototype in Service, produce in Report Builder, productize in Visual Studio when governance demands it. Today, pick your door, build a one-page prototype, test exports, and escalate only if requirements truly expand.</p><p>If this saved you hours, repay the time: subscribe. Listen the next podcast for live Report Builder expressions, a Visual Studio enterprise template, and a downloadable checklist. Lock in your upgrade path&#8212;tap follow and let the next lesson deploy automatically. Proceed.</p>]]></content:encoded></item><item><title><![CDATA[Stop Using DAX UDFs Wrong! The Hidden Gotchas]]></title><description><![CDATA[Opening: You&#8217;re Using DAX UDFs Wrong&#8212;Here&#8217;s Why It Breaks)]]></description><link>https://newsletter.m365.show/p/stop-using-dax-udfs-wrong-the-hidden</link><guid isPermaLink="false">https://newsletter.m365.show/p/stop-using-dax-udfs-wrong-the-hidden</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Wed, 19 Nov 2025 05:50:44 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176781771/b36dd21321b17d9babc86eff980d2296.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Opening: You&#8217;re Using DAX UDFs Wrong&#8212;Here&#8217;s Why It Breaks)</h2><p>You saw DAX user-defined functions and thought, &#8220;Nice. Reusable code.&#8221; And then you used VAL when you needed EXPR, forgot context transition, and produced numbers that look correct while being painfully wrong. That&#8217;s the worst bug: confident nonsense.</p><p>In the next minutes you&#8217;ll get the rules that stop silent errors and wasted compute. We&#8217;ll expose the context transition trap, then the optimization fix nobody applies.</p><p>We&#8217;ll hit three patterns: VAL vs EXPR, CALCULATE inside UDFs, and ADDCOLUMNS to materialize once. Minimal example first, then we scale. And yes, if you skip any rule, your model will tattle.</p><h2>Body 1: The Two Modes That Change Everything&#8212;VAL vs EXPR</h2><p>Here&#8217;s the part the average user glosses over because it looks &#8220;obvious.&#8221; It isn&#8217;t. In DAX UDFs, the parameter passing mode is not decoration; it&#8217;s semantics. It changes when evaluation happens, which changes what result you get. The same function, same arguments, different mode&#8212;different truth.</p><p>VAL means &#8220;pass by value.&#8221; The argument is evaluated once in the caller&#8217;s filter context, then the function receives a fixed scalar. Think of it as a VAR: captured, frozen, immune to whatever shenanigans you perform inside the function. You can change filters, iterate rows, wave a magic wand&#8212;inside the function, that value stays identical every time you reference it.</p><p>EXPR means &#8220;pass by expression.&#8221; You don&#8217;t hand the function a finished number; you hand it the formula, unevaluated. The function evaluates it in its own context every time it&#8217;s used. That makes it behave like a measure: context-sensitive, filter-reactive, and yes, potentially evaluated multiple times.</p><p>The truth? Most broken UDFs are just VAL used where EXPR is mandatory. You thought you were passing a calculation. You passed a snapshot. Then you changed filters inside the function and expected the snapshot to update. It won&#8217;t.</p><p>Minimal scenario to prove it. You build a function: &#8220;ComputeForRed,&#8221; whose job is to take &#8220;some metric&#8221; and compute it for red products. Inside, you set a filter to Color = &#8220;Red&#8221; and return the metric under that filter. If your parameter is VAL and you pass [Sales Amount], here&#8217;s what really happens: [Sales Amount] is computed once in the caller&#8217;s current context&#8212;say, Brand = Contoso&#8212;and that single number is sent into the function. You then apply a red filter and&#8230; nothing changes. You&#8217;re not evaluating [Sales Amount] anymore; you&#8217;re just returning the number you already computed. Result: the &#8220;Red&#8221; number equals the original unfiltered number. Identical. Comfortingly wrong.</p><p>Flip that parameter to EXPR. Now the function receives the expression for [Sales Amount] itself. When you set Color = &#8220;Red&#8221; inside the function and evaluate the parameter, DAX computes the measure under that new filter. The result changes per context, which is what you intended all along. Same function body, different passing mode, completely different meaning. This is why VAL vs EXPR isn&#8217;t a style preference; it&#8217;s the spine of your UDF&#8217;s semantics.</p><p>The stakes are high because the failure mode looks clean. Your table fills. Your totals add up. No errors. Just incorrect math that survives peer review because it &#8220;looks plausible.&#8221; If you enjoy chasing ghost bugs through slicers and bookmarks, continue misusing VAL. Otherwise, learn the decision framework.</p><p>Use VAL when you want a single, context-independent value. Examples: a threshold computed once before you dive into complex logic; a pre-aggregated scalar you intend to hold constant while you compare it to other things; literal constants or parameters the caller controls. VAL is faster and safer when the number shouldn&#8217;t change as you iterate or re-filter inside the function.</p><p>Use EXPR when the function must re-evaluate under its own context, especially across iterators, filters, or time intelligence. If the function says &#8220;for each customer,&#8221; &#8220;inside this FILTER,&#8221; or &#8220;under this modified filter context,&#8221; EXPR is mandatory. You need the argument to breathe with context changes. And yes, the cost is that it may evaluate multiple times&#8212;hold that thought; we&#8217;ll fix it with materialization later.</p><p>Now here&#8217;s the subtlety the average user misses: switching to EXPR isn&#8217;t the end of the story. Passing an expression does not automatically give you context transition. Measures get an implicit CALCULATE when used inside a row context; raw expressions do not. So if your UDF iterates rows and evaluates an EXPR parameter without CALCULATE, you&#8217;re still computing that expression in the wrong context&#8212;typically the broader filter context, not the current row. That&#8217;s why people say &#8220;I used EXPR and it still ignored the current row.&#8221; Of course it did. You forgot to force the transition.</p><p>We&#8217;ll open that loop fully in the next section, but lock this in now: VAL equals precomputed frozen value; EXPR equals lazy formula evaluated on demand. VAL behaves like a VAR; EXPR behaves like a measure. If you remember nothing else, remember this pairing.</p><p>One more micro-story. A team built &#8220;BestCustomers&#8221; to return customers whose metric exceeds the average metric. With VAL, they computed the metric once in the caller, then averaged the same identical number across all customers&#8212;surprise, the average equaled the number. Filtering for &#8220;metric &gt; average&#8221; returned zero rows. It &#8220;worked&#8221; perfectly fast and perfectly wrong. Switching to EXPR made the metric re-evaluate per customer, which fixed the logic&#8212;until they replaced the measure with an inline expression. Then it broke again, because there was no implicit CALCULATE anymore. The fix lives inside the UDF, not in every caller. We&#8217;ll get there next.</p><h2>Body 2: The Context Transition Trap&#8212;Why Your UDF Ignores the Current Row</h2><p>Now for the trap almost everyone falls into. You switch to EXPR, you feel clever, and your UDF still ignores the current row. Fascinating. You assumed DAX would &#8220;do the right thing.&#8221; It doesn&#8217;t. Because expressions passed as EXPR are not automatically wrapped in CALCULATE. Measures are. Raw expressions are not. That single difference is why your results look global instead of per-row.</p><p>Let me slow this down. Context transition is when a row context becomes a filter context. Two ways trigger it: CALCULATE, or invoking a measure in a row context. Measures carry an implicit CALCULATE cloak. Inline expressions do not. When you pass a measure as EXPR and evaluate it inside an iterator, you get transition for free. When you pass an inline expression, you get nothing for free. You must call CALCULATE where the expression is evaluated.</p><p>The thing most people miss: &#8220;I already used EXPR, so my expression will evaluate per customer during AVERAGEX.&#8221; Incorrect. AVERAGEX creates a row context. It does not magically filter your expression unless context transition happens at the evaluation point. No transition, no per-row filtering. You&#8217;ll compute the same number again and again.</p><p>Use the &#8220;BestCustomers&#8221; function to expose the flaw. The function takes a metric as EXPR. It needs to do two things: compute the average metric across all customers, then filter customers whose metric exceeds that average. If the caller passes a measure like [Sales Amount], your code might appear to work because the measure is implicitly wrapped in CALCULATE when evaluated inside AVERAGEX and FILTER. But the moment a caller replaces the measure with the inline formula you always wanted them to use&#8212;say SUMX(Sales, Sales[Quantity] * Sales[Net Price])&#8212;everything breaks quietly. Why? You&#8217;re now evaluating a raw expression without automatic context transition. AVERAGEX iterates customers, but your inner expression never picks up the current customer as a filter. It returns the same global number for every row, the average equals that same number, and your filter eliminates everyone. Empty table. Chef&#8217;s kiss.</p><p>The fix is not to tell callers, &#8220;Please wrap it in CALCULATE.&#8221; That&#8217;s passing the burden to people who won&#8217;t remember. The fix goes inside the UDF, at every point you evaluate the EXPR parameter. Wrap the evaluation in CALCULATE so the row context transitions right there, regardless of whether the caller sends a measure or an inline expression. If your UDF computes MetricExpr in AVERAGEX and then again in FILTER, both places need CALCULATE( MetricExpr ). Not around the entire iterator. Around the expression. Precision matters.</p><p>Rule of thumb you can write on a sticky note: any iterator over rows plus an EXPR that needs row-aware results means you wrap the EXPR with CALCULATE wherever it&#8217;s evaluated. AVERAGEX over Customer? CALCULATE(MetricExpr). FILTER over Customer? CALCULATE(MetricExpr). SUMX, MINX, MAXX&#8212;same pattern. The iterator supplies row context; CALCULATE turns it into filters that your expression can feel.</p><p>Common mistakes deserve quick triage. First, adding CALCULATE in the caller. That &#8220;works&#8221; until someone else calls your UDF and forgets. Now the function behaves inconsistently across callers&#8212;a maintenance nightmare disguised as flexibility. Second, wrapping the whole iterator with CALCULATE and assuming that&#8217;s enough. It isn&#8217;t. CALCULATE transforms the row context present at its invocation. If you call CALCULATE outside the evaluation of the EXPR, you might be transitioning the wrong row context&#8212;or none. Third, mixing measures and inline expressions in tests, then shipping whatever happened to pass. That is gambling, not engineering.</p><p>The game-changer nobody talks about is standardizing context transition inside the function. You make one decision, once, and you encode it where it belongs: at the evaluation sites. That gives you identical semantics whether callers send a measure, an inline formula, or a Franken-expression you don&#8217;t want to look at. Consistency beats cleverness.</p><p>And yes, there&#8217;s a performance bill when you evaluate EXPR multiple times with CALCULATE scattered around. We&#8217;ll pay that down in the next section with materialization. For now, correctness first. Because optimizing the wrong result faster is not productivity; it&#8217;s accelerated failure.</p><p>If you remember nothing else: EXPR is not self-propelled. It doesn&#8217;t &#8220;know&#8221; the current row. Iterators create row context; CALCULATE (or a measure) converts it into filters at the exact moment you evaluate the expression. Put CALCULATE inside your UDF, exactly where you reference the EXPR, every time. Then you can stop pretending DAX is psychic and start getting the numbers you actually intended.</p><h2>Body 3: Stop Recomputing&#8212;Materialize Once with ADDCOLUMNS</h2><p>Correctness is handled. Now stop burning CPU like an amateur. EXPR parameters are lazy formulas, which means every time you reference them, they can re-evaluate under the current filters. Add CALCULATE around them, and you&#8217;ve instructed the engine to perform context transition and run the whole expression again&#8212;per row, per branch, per whim. Do that twice in one function and you&#8217;ve doubled the cost. Do it inside FILTER and then again inside AVERAGEX and, congratulations, you&#8217;ve built a tiny compute heater.</p><p>The thing most people miss is that &#8220;evaluate when needed&#8221; doesn&#8217;t mean &#8220;evaluate every time you think about it.&#8221; The shortcut nobody teaches: materialize once, reuse everywhere. Enter ADDCOLUMNS. Instead of spraying CALCULATE(MetricExpr) across your iterators like confetti, you compute the metric exactly once per entity&#8212;Customer, Product, Date&#8212;and attach it as a temporary column to a small table. From that point on, you reference the column, not the expression. Same logic. Fewer scans. Predictable cost.</p><p>Let me show you exactly how to restructure &#8220;BestCustomers.&#8221; In the naive version, you did two full evaluations of the metric EXPR: one in AVERAGEX to compute the average, one in FILTER to compare each customer to that average. Both wrapped in CALCULATE, both context-aware, both expensive. The optimized version builds a base table first:</p><ul><li><p>Start with a compact table of entities, e.g., VALUES(Customer[CustomerKey]) or ALL(Customer) if you need all customers regardless of current slicers.</p></li><li><p>Use ADDCOLUMNS to add [Metric] = CALCULATE(MetricExpr). This is the one and only time you evaluate the EXPR per customer.</p></li><li><p>Compute the average as AVERAGEX(BaseWithMetric, [Metric]). No CALCULATE needed here, because you&#8217;re just averaging a column you already computed.</p></li><li><p>Filter the same BaseWithMetric table with [Metric] &gt; AverageMetric. Again, you&#8217;re comparing numbers you&#8217;ve already materialized, not re-running the EXPR.</p></li></ul><p>The result: one pass to compute the metric per customer, one pass to compute the average, one pass to filter. Compare that to evaluating the EXPR repeatedly inside nested iterators where the engine can&#8217;t cache anything because you never asked it to.</p><p>Common question: &#8220;Why not compute the average directly from the base table without ADDCOLUMNS?&#8221; Because you still need per-row, context-aware values of the EXPR to compare against the average. ADDCOLUMNS gives you a stable, reusable column that embodies the expensive work. Think of it as building a staging table inside your function. You pay once; you read many times.</p><p>Guardrails, because you&#8217;ll try to be clever. First, choose the smallest entity set that satisfies your logic. Don&#8217;t use ALL(Customer) if your logic should respect current slicers; use VALUES(Customer[CustomerKey]) so you materialize only what&#8217;s visible. Second, name collisions: give the computed column a name that won&#8217;t clash with real columns. You&#8217;re not creating a model column; it&#8217;s temporary, but treat names with care to avoid shadowing. Third, avoid recalculation inside FILTER. If you write FILTER(BaseWithMetric, CALCULATE(MetricExpr) &gt; AverageMetric), you&#8217;ve just undone the optimization. Compare [Metric] to AverageMetric. No CALCULATE. No re-evaluation.</p><p>Another subtlety: if you need multiple branches&#8212;say, you compute both a threshold and a normalized score&#8212;extend the same base table. ADDCOLUMNS supports adding multiple columns at once, each computed once per entity. Then your downstream logic uses those columns freely: TOPN on [Score], FILTER on [Metric] &gt; [Threshold], RANKX over [Score]. One materialization table, many consumers.</p><p>Performance impact in plain terms: fewer storage engine scans, fewer formula engine re-executions, and far less context transition churn. You collapse N evaluations into one per entity. On larger customer sets, that&#8217;s the difference between &#8220;feels instant&#8221; and &#8220;who kicked the server.&#8221; And yes, this also stabilizes results by removing accidental differences when the EXPR is evaluated under slightly different contexts across branches.</p><p>When can you still use VAL safely? When you genuinely mean &#8220;this one value.&#8221; Global thresholds, pre-aggregated scalars you want to hold constant while comparing rows, user-provided parameters&#8212;compute once in the caller, pass VAL, and skip ADDCOLUMNS entirely. VAL is not the enemy; misuse is. The rule is simple: if the function needs the metric per entity and references it more than once, materialize with ADDCOLUMNS. If it&#8217;s a single fixed scalar, keep it VAL and move on.</p><h2>Body 4: Parameter Types, Casting, and Consistency&#8212;Quiet Data Traps</h2><p>Let&#8217;s talk about types&#8212;the part most people treat like decorative labels. In DAX UDFs, parameter type hints are documentation first, enforcement last. The engine will happily coerce arguments to the declared type, and it does so before the function body executes for VAL, and at evaluation time for EXPR. Subtle? Yes. Quietly destructive? Also yes.</p><p>The truth? Casting happens earlier than you think. With VAL, the argument is evaluated in the caller&#8217;s context, coerced to the declared type, then the coerced value is sent into your function. The value is now frozen and typed. With EXPR, you pass the unevaluated expression. The function evaluates that expression later, in its own context, and only then applies the type coercion you declared. Same declaration, different moment of truth.</p><p>Here&#8217;s the clean example that exposes the trap. You declare a function with two integer VAL parameters and do A + B. You call it with 3.4 and 2.4. What happens? The engine coerces both inputs to integers before the function sees them. 3.4 becomes 3. 2.4 becomes 2. Five goes in, five comes out. If you pass &#8220;3.4&#8221; and &#8220;2.4&#8221; as strings, the engine still converts to integers, still 3 and 2, still 5. You didn&#8217;t write a rounding bug; you wrote a type hint that triggers truncation&#8212;and you forgot you wrote it.</p><p>Implication one: for VAL parameters, the cast is part of the call site. You get a single, pre-coerced scalar, and whatever precision or scale you lost is gone. No amount of cleverness inside the function resurrects it, because the damage happened before entry. Implication two: for EXPR parameters, your casting semantics ride along with the evaluation points. If you declare the EXPR parameter as integer and then evaluate it inside an iterator, you&#8217;re coercing each row&#8217;s result to integer at that moment. That means your per-row metric just got truncated per row. Accumulate that into an average? Congratulations, you invented silent undercounting.</p><p>So do we stop declaring types? No. Declare types for clarity and intent. But choose types that align with the math you intend. If the metric is monetary or fractional, declare decimal&#8212;not integer. If the EXPR can return BLANK, consider whether coercion to integer or decimal should treat BLANK as zero or propagate BLANK. Know the conversion rules you&#8217;re inviting.</p><p>Two guardrails keep you out of trouble. First, document mode and type together: &#8220;param Metric: EXPR, Decimal.&#8221; That single line tells readers when evaluation happens and how results will be coerced. Second, test edge cases where coercion bites: decimals just below and above whole numbers; BLANKs; large values near type limits; strings that look like numbers. If the function compares a metric against a threshold, test both as VAL and as EXPR to confirm you aren&#8217;t truncating one side of the comparison and not the other.</p><p>Consistency is the boring superpower. Keep parameter types aligned with expected semantics across your function library. If two functions both accept &#8220;Metric,&#8221; they should both declare it EXPR, Decimal, unless you&#8217;re deliberately changing behavior. Silent coercion surprises aren&#8217;t clever; they&#8217;re maintenance debt. And no, the engine won&#8217;t warn you. It will simply obey.</p><p>Before we move on, one last nudge: types are not your safety net; they&#8217;re your contract. Use them to communicate intent, not to correct sloppy callers. If you need protection, assert it in code&#8212;validate shape and BLANK handling explicitly. Otherwise, you&#8217;ve built a haunted house where numbers look normal and whisper lies.</p><h2>Body 5: Authoring Checklist&#8212;UDFs That Don&#8217;t Betray You Later</h2><p>Now let&#8217;s turn this into muscle memory. Here&#8217;s the checklist I use so my UDFs behave the same on Monday and Friday.</p><p>Decide mode per parameter, deliberately. VAL for fixed scalars you want to hold constant through the function&#8217;s logic&#8212;thresholds, user inputs, or pre-aggregations computed once in the caller. EXPR for context-reactive formulas that must be re-evaluated under filters the function applies or iterators it runs. If you find yourself writing &#8220;for each X&#8221; in a comment, that parameter is EXPR. If the sentence is &#8220;compare to this one number,&#8221; that parameter is VAL.</p><p>Encapsulate CALCULATE inside the UDF for any EXPR evaluated in row-sensitive contexts. Not in the caller. Not &#8220;only when it breaks.&#8221; At every evaluation site. If you use the EXPR in AVERAGEX and again in FILTER, both places get CALCULATE. If you branch on it with IF or SWITCH and evaluate in two branches, both branches get CALCULATE. Measures get implicit context transition; raw expressions do not. Standardize the behavior inside the function so callers can&#8217;t create inconsistency by accident.</p><p>Materialize with ADDCOLUMNS when an EXPR is used more than once or drives multiple branches. Build a small base table of entities, attach [Metric] = CALCULATE(MetricExpr) once, then reuse [Metric] for averages, filters, ranks, and thresholds. This collapses N evaluations into one per entity and de-drama-tizes your performance profile. If you need multiple derived metrics, add them in the same ADDCOLUMNS call&#8212;[Metric], [Threshold], [Score]&#8212;so downstream logic reads columns, not expressions.</p><p>Avoid caller burden by designing self-sufficient functions. Callers should not have to remember to wrap arguments in CALCULATE, align types, or pre-filter entities. If you need a consistent entity set, define it inside: VALUES(Customer[CustomerKey]) for current filters, or ALL(Customer) if the function&#8217;s logic demands an unfiltered set. If you must accept a table from the caller, document whether it&#8217;s expected to be pre-filtered and validate its shape.</p><p>Test across a simple matrix that mirrors real usage. Four axes: measure versus inline expression; sliced versus unsliced context; small versus large entity sets; and presence versus absence of BLANKs. If your function returns a table, test row counts under common slicers and a deliberately filtered subgroup to prove per-row behavior. If it returns a scalar, test totals and subtotals in a visual to ensure it aggregates as intended. Never ship on the strength of one green check.</p><p>Version and reuse like a grown-up. Centralize functions in your model or shared package. Name them predictably. In the function header, annotate parameter modes, types, and rationale: &#8220;Metric: EXPR Decimal&#8212;evaluated with CALCULATE per row; Threshold: VAL Decimal&#8212;held constant.&#8221; When you revise a function for performance, bump a version tag in the comment and note the change, especially if you alter materialization or entity selection.</p><p>Guardrails for the habitual foot-shooters. Don&#8217;t sprinkle CALCULATE around the iterator and call it a day; wrap the EXPR where evaluated. Don&#8217;t recompute the EXPR inside FILTER after materializing it; compare the materialized column. Don&#8217;t accept a &#8220;metric&#8221; as VAL and expect it to react to filters you apply inside; that&#8217;s a contradiction. Don&#8217;t declare integer for a decimal metric because &#8220;it seemed fine on the sample file.&#8221; It wasn&#8217;t. It truncated.</p><p>A quick mnemonic to stick on your monitor: Mode, Move, Make. Mode: choose VAL or EXPR with intent. Move: force row context to filter context with CALCULATE at evaluation points. Make: materialize once with ADDCOLUMNS when you&#8217;ll reuse. If you remember nothing else, that sequence keeps you out of 90 percent of disasters.</p><p>And yes, you can still use VAL safely&#8212;when you actually mean &#8220;this one value.&#8221; Thresholds, caps, user selections, pre-aggregated baselines belong to VAL. Everything that needs to breathe with context belongs to EXPR. Design for the caller you have&#8212;distracted, hurried, occasionally wrong&#8212;and put the correctness inside the function. That&#8217;s how you build UDFs that won&#8217;t betray you later.</p><h2>Body 6: Compact Walkthrough&#8212;From Wrong to Right in One Flow</h2><p>Start naive. BestCustomers(metric: VAL). Inside, iterate customers, compute average metric, then filter customers with metric &gt; average. Result? Empty. You passed one precomputed number, then compared that number to itself a thousand times. Of course nothing survived.</p><p>Flip to EXPR but keep the inline formula instead of a measure. Still wrong under the iterator. Why? No implicit CALCULATE. You created row context but never transitioned it. Every row evaluated the same global value.</p><p>Fix correctness. Keep EXPR and wrap each evaluation with CALCULATE: once in AVERAGEX, again in FILTER. Now the metric respects the current customer. Rows appear, totals behave.</p><p>Fix performance. Build Base = ADDCOLUMNS(VALUES(Customer[CustomerKey]), &#8220;Metric&#8221;, CALCULATE(metric)). Compute AvgMetric = AVERAGEX(Base, [Metric]). Return FILTER(Base, [Metric] &gt; AvgMetric). One evaluation per customer, reused everywhere.</p><p>Quick sanity checks: row count increases under fewer slicers; a small filtered brand shows fewer &#8220;best&#8221; customers; totals reconcile with expectations.</p><h2>Conclusion: The Three Rules You Can&#8217;t Skip</h2><p>Choose VAL for fixed scalars, EXPR for context-reactive formulas; force context transition with CALCULATE exactly where EXPR is evaluated; materialize once with ADDCOLUMNS and reuse. If this saved you debugging hours, subscribe. Next: advanced UDF patterns&#8212;custom iterators, table-returning filters, and performance traps you&#8217;ll avoid on day one.</p>]]></content:encoded></item><item><title><![CDATA[Stop Syncing Your OneDrive Like It's 2007: Use Shortcuts]]></title><description><![CDATA[Introduction: Why Your OneDrive Is Slow]]></description><link>https://newsletter.m365.show/p/stop-syncing-your-onedrive-like-its</link><guid isPermaLink="false">https://newsletter.m365.show/p/stop-syncing-your-onedrive-like-its</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Tue, 18 Nov 2025 17:45:34 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176781338/4586987ad80a0a345e9fd751811ee2e2.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Introduction: Why Your OneDrive Is Slow</h2><p>You&#8217;re not unlucky. Your OneDrive isn&#8217;t haunted. It&#8217;s slow because you&#8217;re still treating cloud storage like an external hard drive from 2007. The spinning sync icon, the phantom &#8220;Processing changes&#8230;&#8221;, the fan ramping like it&#8217;s about to take flight&#8212;those are symptoms, not mysteries. The truth? You&#8217;re forcing your device to mirror entire SharePoint libraries you barely touch. That&#8217;s storage bloat, CPU churn, and network thrash&#8212;all for files you don&#8217;t need locally.</p><p>Here&#8217;s the fix: stop syncing everything. Use shortcuts. They give you instant access without dragging terabytes into your laptop&#8217;s tiny, overworked SSD. Today I&#8217;ll show you exactly why the old method fails and how shortcuts save storage, boost performance, and keep governance intact.</p><h2>The Hidden Cost of Traditional Syncing (The 2007 Method)</h2><p>Let&#8217;s define the 2007 method: you click Sync on a SharePoint library and pull the whole thing into File Explorer. It feels comforting&#8212;local-looking folders, everything &#8220;right there.&#8221; The problem? You just invited a marching band of files, folders, and metadata to live rent-free in your machine&#8217;s head. And yes, the parade never stops.</p><p>First cost: metadata overhead. Every item comes with properties&#8212;names, sizes, modified dates, authors, versioning pointers. Sync doesn&#8217;t just grab the content; it negotiates the structure, indexes it, and keeps it coherent. Thousands of items? That&#8217;s thousands of conversations with your disk and CPU. It&#8217;s like asking your laptop to memorize a phone book just in case you call one contact.</p><p>Second cost: file system integration. The OneDrive client hooks into the OS to present cloud files as local entries. That integration is powerful, but it&#8217;s not free. The more items you expose, the more the OS has to index, thumbnail, preview, and watch for changes. You scroll a giant folder, and Windows obligingly renders previews. That&#8217;s your CPU paying an &#8220;aesthetic tax&#8221; for content you&#8217;ll never open.</p><p>Third cost: bandwidth and churn. Even with Files On-Demand, syncing a large library means the client still evaluates each item, checks change states, and negotiates conflicts. Network traffic spikes not because you&#8217;re opening files, but because your client is reconciling the world&#8217;s most boring long-distance relationship&#8212;constantly checking, &#8220;Are we still in sync?&#8221; Multiply that by multiple devices, and congratulations, you&#8217;re running a distributed consensus algorithm to read a single deck.</p><p>Fourth cost: storage creep. &#8220;But Files On-Demand!&#8221; Yes, and yet users still pin folders &#8220;Always keep on this device&#8221; for travel or out of fear. That one checkbox quietly hoards gigabytes. Then version history and temporary caches nibble at the edges. Suddenly your 256 GB device is doing cosplay as a file server, and Windows Update is begging for space.</p><p>Fifth cost: reliability. Larger sync scopes magnify error surface. A single funky filename, a path too long, or a wonky permission in a nested folder can stall the queue. Now every change waits behind a traffic cone because one subfolder can&#8217;t make up its mind. You&#8217;ll see &#8220;Can&#8217;t sync this library&#8221; for reasons that vanish when you stop forcing the entire library to live locally.</p><p>Sixth cost: governance drift. Full sync encourages copies. Users drag files to Desktop, email them, duplicate them for &#8220;safety.&#8221; Now you&#8217;ve got five versions, four opinions, and one audit headache. You moved outside the governed source. Retention, sensitivity, access&#8212;all now a guessing game. The more you sync locally, the easier it is to fork content into unmanaged pockets.</p><p>Seventh cost: cross-device tax. Every new machine means re-adding those same giant libraries. Each device rebuilds indexes, re-evaluates file states, and re-learns the same lessons you refused to learn once. It&#8217;s Groundhog Day with more spinning wheels.</p><p>And here&#8217;s the kicker: you don&#8217;t even gain certainty. People sync &#8220;just in case,&#8221; but Files On-Demand already gives you the illusion of local with cloud-backed reliability. The difference is scope. Traditional sync says &#8220;bring the neighborhood.&#8221; Smart access says &#8220;bookmark the door.&#8221;</p><p>Now, why is this painfully familiar? Because it used to be the only way to make SharePoint usable in File Explorer. That was then. Today, &#8220;Add shortcut to OneDrive&#8221; gives you the same navigability without the bulk. Shortcuts surface precisely the folders you actually use, nested right inside your OneDrive. They roam across devices automatically. They don&#8217;t drag the entire library into the OS watcher. They don&#8217;t pressure your SSD. They don&#8217;t flood your network with pointless handshakes.</p><p>The thing most people miss: performance degrades exponentially with library size. Every additional thousand items adds not just one unit of work but branches of additional scanning, indexing, and state management. Shortcuts collapse the scope. Fewer items tracked. Fewer thumbnails rendered. Fewer permission edge cases. Fewer sync conflicts waiting to happen.</p><p>If you remember nothing else, remember this: traditional full-library sync optimizes for familiarity, not efficiency. It makes your laptop feel busy, not productive. And in an era of pooled storage and AI-driven discovery, treating cloud like a USB drive is quaint, wasteful, and, frankly, unprofessional. Use the cloud like the cloud. Limit your local blast radius. Point to the source. Use shortcuts.</p><h2>Introducing OneDrive Shortcuts: The Modern Solution</h2><p>Enter shortcuts&#8212;the adult way to access shared content without turning your laptop into a storage martyr. Add Shortcut to OneDrive doesn&#8217;t clone a library. It creates a lightweight pointer to exactly the folders you care about, and places them inside your OneDrive so they show up in File Explorer, Finder, and the OneDrive web&#8212;across every device you use. Essentially, you get doorways, not duplicates. Doorways don&#8217;t need cleaning, defragging, or babysitting.</p><p>Why this matters: scope. Shortcuts constrain the sync client&#8217;s awareness to what you actually work on. The OneDrive client still manages state, but across a sharply reduced set of items. That translates directly to fewer file system hooks, faster folder opens, quicker thumbnails, and a calmer activity center. The result is immediate: the &#8220;Processing changes&#8230;&#8221; spinner turns from a lifestyle into a blink.</p><p>And yes, offline still works&#8212;properly. Mark a shortcut folder or file &#8220;Always keep on this device&#8221; and only that subset is cached. Not the entire library. Not its six-year archive of retired brochures. Your SSD breathes. Your plane-time editing is focused. When you reconnect, the sync client reconciles a small, purposeful set of changes instead of litigating a corporate archive from 2014.</p><p>Cross-device behavior is another win. Shortcuts roam with your OneDrive identity. Sign in on a new machine and your shortcuts appear where you expect&#8212;no hunting through SharePoint URLs, no repeating the &#8220;Sync this library&#8221; ritual. It&#8217;s like muscle memory, but without the repetitive strain injury. Compare that to full-library sync, where you reconstruct the same sprawling mess on every fresh device. Efficiency equals consistency.</p><p>Governance fans&#8212;this is your moment. Shortcuts point to the single governed source. Sensitivity labels, retention policies, permissions, and version history all remain intact because you&#8217;re not copying anything. You&#8217;re not exporting content into unmanaged corners. You&#8217;re collaborating on the original. The reason this works is simple: governance applies to the file, not the doorway. So you keep compliance while regaining sanity.</p><p>Organization improves too. Shortcuts let you curate your working set. Pin the three client folders you actually use, ignore the rest of the library. You can even rename the shortcut locally for clarity&#8212;&#8220;Q4 Decks&#8221; instead of &#8220;Marketing-Field-Enablement-Assets-EMEA&#8221;&#8212;without touching the source. This is the interface equivalent of subtitles: the underlying content stays in its native language, you see what helps you think.</p><p>Now here&#8217;s where most people mess up: they assume shortcuts are merely a UI trick. They&#8217;re not. Under the hood, shortcuts reduce the sync graph&#8212;fewer nodes, fewer watchers, fewer permission edges to evaluate. That shaves CPU wake-ups, kills pointless network checks, and slashes the probability of a single bad filename freezing your queue. It&#8217;s not glamorous, but performance comes from subtracting the right complexity.</p><p>And because Microsoft finally acknowledged reality, the product now favors shortcuts. The Add Shortcut button is prominent in SharePoint libraries. Try to sync a folder you&#8217;ve shortcut already, and OneDrive can replace the old relationship. In File Explorer, those shortcut folders sit alongside your own, with clear naming that shows the real location. Translation: less &#8220;Where does this actually live?&#8221; and fewer panicked Teams messages at 4 p.m.</p><p>The game-changer nobody talks about is mental load. With full sync, your file tree becomes a museum. With shortcuts, it becomes a workstation&#8212;curated, current, and relevant. You open File Explorer and see the five places that matter. Decision fatigue drops. Navigation becomes muscle memory. And when your priorities change, you remove a shortcut. No cleanup. No tombstones. No &#8220;Are you sure?&#8221; prompts about deleting half a department.</p><p>If you remember nothing else: shortcuts are cloud-native literacy. They deliver access without baggage, offline without hoarding, and governance without gymnastics. They make your machine fast again by making your scope honest. You don&#8217;t need every file. You need the right doors. Add the doors. Stop moving the building.</p><h2>Step-by-Step Guide: Adding Shared Libraries as Shortcuts</h2><p>Let me show you exactly how to add only what you need&#8212;no storage bloat, no drama. We&#8217;re going from &#8220;giant library, endless syncing&#8221; to &#8220;surgical access&#8221; in a few clicks.</p><p>Start in SharePoint where the content actually lives. Open the site, go to the Documents library, and navigate to the specific folder you actually work in. Not the top-level &#8220;dump everything since 2013&#8221; folder&#8212;the one you touch weekly. In the command bar, click Add shortcut to OneDrive. If you don&#8217;t see it, you&#8217;re probably staring at the root library; drill into a subfolder or confirm you have permission to that path. Click it. Done. You&#8217;ve created a doorway, not a duplicate.</p><p>Now switch to OneDrive on the web. In the left nav, select My files. You&#8217;ll see a new entry with a chain link icon. That&#8217;s your shortcut. Rename it locally to something sane. Click the three dots, Rename, give it a name that matches how your brain files work&#8212;&#8220;Client A &#8211; Contracts,&#8221; not &#8220;Legal-Shared-Docs-v2.&#8221; You&#8217;re renaming the doorway, not the source. No governance harmed.</p><p>Let&#8217;s make it practical in File Explorer. Open File Explorer, go to your OneDrive. Your shortcut folder appears alongside your own folders. If you want it pinned for instant access, right-click and Pin to Quick Access. That&#8217;s your fast lane. For offline travel, right-click the specific subfolder or files inside that shortcut and choose Always keep on this device. Do not apply that to the shortcut root unless you enjoy recreating the exact mistake we&#8217;re escaping. Cache only what you&#8217;ll actually edit on a plane.</p><p>Replacing an old full sync with a shortcut? Good. First, identify the synced path: in File Explorer, look for the library name under your organization. Right-click the library and choose Settings, then click Stop sync. Confirm. If you already added a shortcut for that same folder, the OneDrive client is smart enough these days to replace the relationship cleanly. If it prompts about items that are open or pending upload, resolve those first. Translation: close the file you &#8220;left open since Tuesday.&#8221;</p><p>Back to SharePoint for multi-folder curation. You can add multiple shortcuts from different sites and libraries. Repeat: open the site, navigate to the working folder, Add shortcut to OneDrive. In OneDrive, group your shortcuts by creating a local &#8220;Work Hubs&#8221; folder and dragging your shortcut entries into it. You&#8217;re organizing your doors, not moving the building. If you ever need to remove one, right-click the shortcut in OneDrive and select Remove shortcut. The source remains untouched. The door vanishes. Bliss.</p><p>Need to share the source with teammates? Use the real share controls in SharePoint or OneDrive on the web from inside the shortcut. You&#8217;ll see modern sharing, including the upcoming hero link model&#8212;one superpowered link governing access. Copy the address bar URL when enabled; it&#8217;s the same link. You&#8217;re not emailing local paths. You&#8217;re not spawning orphans on people&#8217;s desktops. You&#8217;re granting access to the governed file.</p><p>Common mistakes to avoid. One: adding shortcuts to the root of every library like you&#8217;re collecting stamps. Curate. Two: marking entire shortcut trees Always keep on this device. Cache precisely. Three: dragging files out of a shortcut to your Desktop because &#8220;it&#8217;s faster.&#8221; That&#8217;s how you fork versions and break governance. Work in place. Four: re-syncing the full library later out of habit. If you feel the itch, take a walk, then add the single folder you actually need.</p><p>Admin tip: to migrate users at scale, communicate the pattern first&#8212;doorways, not duplicates. Then, schedule a fifteen-minute cleanup: stop legacy syncs, add three essential shortcuts, pin them, set offline for one subfolder. After rollout, check the OneDrive Sync Health dashboard for errors and stale builds. You&#8217;ll see fewer items, fewer failures, and fewer &#8220;Processing changes&#8230;&#8221; confessions. Congratulations. You&#8217;ve traded hoarding for intent.</p><h2>Managing Your Shortcuts: Organization and Removal</h2><p>Shortcuts are only powerful if you keep them tidy. Think of them like labeled doors on a hallway. Too many doors, no labels, and you&#8217;re back to wandering a maze. So let&#8217;s impose order.</p><p>Start with a naming convention. You need three parts: Who, What, When. For example: &#8220;Client-A &#8211; Contracts &#8211; Active&#8221; or &#8220;Finance &#8211; Q4 Reporting &#8211; 2025.&#8221; Front-load the category so similar shortcuts cluster alphabetically. Put the team or function first, then the specific purpose, then a time frame if it matters. It&#8217;s not art&#8212;it&#8217;s retrieval speed.</p><p>Create hubs. Inside OneDrive, make two or three top-level folders to corral your shortcuts: &#8220;Clients,&#8221; &#8220;Internal,&#8221; &#8220;Archive.&#8221; Drag shortcuts into those hubs. You&#8217;re not moving content, you&#8217;re arranging links. If your work spans multiple roles, add a &#8220;Now&#8221; folder and keep only the three most-used shortcuts there. Everything else lives one click away. The truth? Fewer visible choices equals faster decisions.</p><p>Use emoji sparingly as visual anchors. A briefcase for client work, a lock for regulated areas, a chart for analytics. One emoji, at the front, not a kindergarten art show. This helps your eye land on the right doorway instantly in File Explorer and on the web. And yes, it syncs fine.</p><p>Pin with intent. In File Explorer, right-click your top three shortcuts and Pin to Quick Access. Don&#8217;t pin fifteen; that defeats the point. On Mac, add them to the Finder sidebar. Refresh these pins monthly. If it hasn&#8217;t earned a pin in thirty days, it doesn&#8217;t deserve that prime real estate.</p><p>Surface working sets. Inside a shortcut, use Favorites (or Add to Quick Access) on the subfolders you touch daily. This gives you a two-level speed path: door, then desk. Mark just one or two subfolders Always keep on this device for travel. Cache expands; discipline contracts it.</p><p>Curate seasonal rot. End of quarter? Move shortcuts you no longer need into your &#8220;Archive&#8221; hub. Rename them with a suffix &#8220;(Archive)&#8221; so your brain knows they&#8217;re cold paths. Do not delete the shortcut just because a project ended; archived links are breadcrumbs for future audits.</p><p>Detect redundancy. If you have two shortcuts pointing into the same library at adjacent levels&#8212;say &#8220;Marketing &#8211; Campaigns&#8221; and &#8220;Marketing &#8211; Campaigns &#8211; Q4&#8221;&#8212;merge your intent. Keep the more precise one. The thing most people miss: overlapping scopes duplicate cognitive load and increase the chance you set the wrong folder to offline.</p><p>Audit monthly. Ten minutes. Open OneDrive web, sort by Type and filter for Shortcuts. Scan the list:</p><ul><li><p>Not used in 30 days? Archive or remove.</p></li><li><p>Confusing names? Rename locally.</p></li><li><p>Duplicates? Consolidate.</p></li><li><p>Wrong owner team? Fix the name prefix.</p></li></ul><p>Removal, the safe way. Removing a shortcut deletes the door, not the building. In OneDrive web or File Explorer, right-click the shortcut and choose Remove shortcut. If you get an error, you probably pinned subfolders for offline use. Clear Always keep on this device on any child items, wait for sync to settle, then remove. The source content remains governed and intact.</p><p>When you should delete the source? Rarely&#8212;and only in the actual SharePoint library with proper permissions and policy awareness. Use retention views, version history, and recycling workflows. Shortcuts are navigation, not authority.</p><p>Clean up legacy sync artifacts. If you previously synced a library and switched to shortcuts, you might still have a dusty local folder sitting under your organization name. Confirm it&#8217;s stopped syncing in OneDrive Settings. If it&#8217;s disconnected and empty, delete the local folder. If it still has content, you likely stranded files outside the source. Upload them to the correct SharePoint path, then retire the artifact. Don&#8217;t carry ghosts forward.</p><p>Governance alignment. If your org uses sensitivity labels or specific site naming standards, mirror those prefixes in your shortcut names: &#8220;[Confidential] Legal &#8211; M&amp;A &#8211; Active.&#8221; That echo reduces misfiling and reminds you&#8212;subtle but effective&#8212;what not to download to every device.</p><p>Finally, embrace rotation. Your shortcut set should reflect your current quarter&#8217;s reality, not last year&#8217;s org chart. Add doors when priorities rise. Remove doors when they fade. A lean hallway is productive. A crowded hallway is chaos in slow motion. Keep it lean.</p><h2>When to Sync vs. When to Use a Shortcut (The Decision Matrix)</h2><p>Let&#8217;s end the guesswork. Here&#8217;s the decision matrix you should&#8217;ve had years ago.</p><p>Use a shortcut when the library is large, the team is broad, and you only touch a slice of it. Translation: most SharePoint libraries. Shortcuts constrain scope, cut CPU wake-ups, and keep you inside governance. If you open a few folders weekly and the rest is corporate archaeology, add shortcuts to the living parts and ignore the tombs.</p><p>Use a shortcut when you work across multiple sites. You need a curated working set from Sales, Legal, and Product? Don&#8217;t sync three libraries; add three surgical doors. They roam across devices automatically. New laptop, same clean hallway.</p><p>Use a shortcut when your device storage is finite&#8212;so, always. Shortcuts don&#8217;t hoard. Cache precisely what you&#8217;ll edit offline. Avoid turning a 256 GB ultrabook into a pretend file server.</p><p>Use a shortcut when stability matters. If sync errors and conflict dialogs ruin your afternoons, reduce the blast radius. Fewer tracked items means fewer chances for a single cursed filename to block the queue.</p><p>Use full sync only when offline is non-negotiable for the entire scope. Example: field teams in dead zones who genuinely need whole working folders&#8212;plural&#8212;at all times. Even then, define the smallest sensible boundary, not the entire site. You need reliable offline? Fine. You don&#8217;t need the last decade of PDFs.</p><p>Use full sync when you&#8217;re running local automations that must see files as native paths at scale&#8212;heavy scripting, third-party tools that don&#8217;t understand cloud placeholders, or workflows that expect an always-present tree. Even here, prune ruthlessly. Automations love narrow inputs.</p><p>Use full sync if you&#8217;re in a specialized scenario like media production where large binaries must be streamed locally for performance. But be honest: that&#8217;s a small population with beefy storage. If you&#8217;re on a thin-and-light, this is not you.</p><p>Avoid both when a link is enough. If you&#8217;re handing someone a one-off file, share it; don&#8217;t create a lifelong relationship to a folder you&#8217;ll forget tomorrow. Hero link models simplify this further. Share access; don&#8217;t architect access.</p><p>Rules of thumb, so you stop asking:</p><ul><li><p>If you need visibility, not possession, use a shortcut.</p></li><li><p>If you need possession of a small, predictable subset, use a shortcut plus selective offline.</p></li><li><p>If you need blanket possession for critical offline work or rigid local tooling, use constrained sync.</p></li><li><p>If you think you need everything, you&#8217;re wrong. You need discipline.</p></li></ul><p>Edge cases people bungle: departmental libraries with 50k items. Neither method is happy. Break the library into logical substructures, archive dead weight, and shortcut the active zones. Syncing that scale invites pain; shortcutting the root invites clutter. Structure first, then decide.</p><p>Another edge: legal holds and sensitivity labels. Shortcuts respect policy because they point at the governed source. Full sync doesn&#8217;t bypass policy, but it tempts behavior that does&#8212;dragging copies, emailing attachments. If retention and labeling matter, keep users in-place via shortcuts and modern sharing.</p><p>The truth? Most &#8220;sync or shortcut&#8221; debates are about comfort, not requirements. Comfort is expensive. Your CPU, your storage, your governance posture all pay for your nostalgia. Choose the smallest surface that satisfies the real constraint: access, offline, or automation. Then implement the least invasive path. That&#8217;s shortcuts nine times out of ten.</p><h2>Conclusion: Future-Proofing Your Cloud Storage</h2><p>Here&#8217;s the takeaway: treat the cloud like the cloud. Stop mirroring entire libraries because 2007 told you it felt safe. Shortcuts give you speed, governance, and sanity by shrinking your scope to the work that matters. Sync is a tool, not a lifestyle&#8212;use it only when offline scale or stubborn tooling actually demands it.</p><p>Now do the adult thing. Replace legacy syncs with three essential shortcuts. Pin them. Mark exactly one subfolder for offline. Kill the rest. If you want the migration playbook with naming conventions, offline rules, and an admin rollout checklist, subscribe and listen the next podcast. We&#8217;ll do the cleanup together and your laptop will finally act its age.</p>]]></content:encoded></item><item><title><![CDATA[3D Objects Are the Ultimate Test of Fabric Governance | Catalyst E3]]></title><description><![CDATA[Introduction: Why 3D Objects Matter to Governance]]></description><link>https://newsletter.m365.show/p/3d-objects-are-the-ultimate-test</link><guid isPermaLink="false">https://newsletter.m365.show/p/3d-objects-are-the-ultimate-test</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Tue, 18 Nov 2025 05:37:35 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176780731/5bca98c809d2c8844df5af8d05a3400c.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Introduction: Why 3D Objects Matter to Governance</h2><p>You think spreadsheets are messy? Cute. 3D photorealistic objects and digital twins are data on nightmare mode&#8212;multi-gigabyte textures, meshes, materials, physics, versions, usage rights, and lineage that spans cameras, LiDAR, GPUs, and clouds. If your governance breaks here, it will break everywhere. The truth? 3D assets expose every weak assumption you&#8217;ve made about identity, security, lifecycle, and compliance. And that&#8217;s why they&#8217;re the perfect stress test for Microsoft Fabric. Handle the heaviest, weirdest data in a single architecture with consistent policy&#8212;and suddenly everything else in your enterprise looks trivial. So today, I&#8217;m going to show you why Fabric&#8217;s unified governance isn&#8217;t &#8220;nice to have.&#8221; It&#8217;s the difference between scalable reality and an expensive art project.</p><h2>Defining Fabric Governance: The Foundation of Trust</h2><p>Let&#8217;s get precise. Governance in Fabric isn&#8217;t a stack of policies you forget to enforce. It&#8217;s the operating system for your data life: identity, permissioning, lineage, classification, policy, and monitoring&#8212;wired into OneLake, workspaces, items, and compute, not duct-taped after the fact. It&#8217;s not just a database; it&#8217;s the spine of your data estate.</p><p>Why this matters with 3D: a single asset isn&#8217;t &#8220;a file.&#8221; It&#8217;s a constellation&#8212;high-res photogrammetry images, point clouds, meshes, textures, materials, rigging metadata, simulation parameters, and derived variants for AR, robotics, and training. Each piece has different sensitivity, owners, licenses, and allowable uses. The average user tries to shove that into folders. You need deterministic control.</p><p>Enter Fabric&#8217;s core. Security starts with Microsoft Entra ID&#8212;consistent identity across producers, processors, and consumers. That means when an artist, a data engineer, or a robotics team touches an object, access is role-bound and auditable. No mystery shares, no &#8220;who sent me this ZIP?&#8221; chaos. Row-and-column security isn&#8217;t the hero here&#8212;object-level and workspace scoping are. You gate entire artifacts and their derivatives with the same identity fabric.</p><p>Now, the thing most people miss: governance without lineage is theater. Fabric&#8217;s built-in lineage maps how a raw capture flowed into a processed mesh, into a compressed LOD set, into a robot training simulation, and finally into a KPI dashboard showing training efficiency. You see sources, transformations, and downstream consumers. If a source scan is recalled due to rights restrictions, you don&#8217;t guess where it went&#8212;you follow the lineage and revoke, reprocess, or quarantine everything it contaminated. That&#8217;s trust you can act on.</p><p>Classification and labels are your next lever. Sensitive, licensed, export-controlled, internal-only&#8212;the tag follows the asset as it moves. Not as a sticky note, as metadata the platform respects. Policy enforces labels: share blocks, cross-geo controls, retention, and encryption at rest/in transit. With 3D, this is non-negotiable. That &#8220;free&#8221; texture pack? If it&#8217;s not licensed for commercial digital twins, your policy should stop it at the gate. Yes, proactively. Because you like not getting sued.</p><p>Storage gravity kills most architectures. OneLake flips it: a single logical data lake with open formats and shortcut semantics so you don&#8217;t spawn fifteen brittle copies. For 3D, that means canonical assets live once, with derived views for teams and tools. Compute comes to the data&#8212;Spark for processing, pipelines for orchestration, notebooks for transformation&#8212;while governance remains consistent. Compare that to &#8220;download, edit locally, re-upload, hope nobody else changed it.&#8221; Amateur hour.</p><p>And yes, monitoring. Activity logs, access audits, data movement reports. If a 90GB mesh starts exfiltrating to an unknown region, you don&#8217;t wait for a quarterly review. Alerts fire, policies trigger. The platform behaves like it knows your risk tolerance&#8212;because you taught it.</p><p>Let me show you exactly how this lands in a real workflow. Capture teams dump raw scans into an ingestion workspace with strict contributor roles and automatic classification: Licensed, Source, Region=EU. Pipelines validate schema and rights metadata; anything noncompliant gets quarantined. Processing runs on governed compute&#8212;Spark jobs tag outputs with lineage, versioning, and usage rights. Publishing promotes approved derivatives to a shared Product workspace via shortcuts&#8212;no duplication. Consumers&#8212;robotics, training, analytics&#8212;get read access to only the derivatives their roles allow. If legal updates a policy&#8212;say, &#8220;no export of assets with Origin=SiteA&#8221;&#8212;Fabric retroactively blocks share links, marks affected items, and surfaces the dependency graph so owners patch or replace.</p><p>The reason this works is simple: governance isn&#8217;t separate from productivity; it&#8217;s fused to it. People do the right thing by default because the platform translates policy into the path of least resistance. When the hardest data type you own&#8212;3D twins&#8212;flows cleanly through identity, lineage, classification, policy, and monitoring, every spreadsheet, CSV, and parquet file falls in line. Refusing unified governance is like refusing updates. And yes, they require restarts&#8230; because Microsoft is not performing magic tricks.</p><h2>The Complexity Barrier: Why 3D Data Breaks Traditional Systems</h2><p>Here&#8217;s the uncomfortable truth: traditional data stacks were built for rows and columns and, at their most adventurous, a few chunky files in a shared drive. 3D data laughs at that. A single photoreal object is not &#8220;a file.&#8221; It&#8217;s a high-poly mesh, multiple levels of detail, displacement and normal maps, PBR material graphs, HDRI lighting references, thousands of source photos, LiDAR point clouds, rigging metadata, physics constraints, simulation parameters, and half a dozen derivative exports for game engines, robotics, and AR. That&#8217;s not storage; that&#8217;s a supply chain.</p><p>Now, try versioning it. &#8220;v2-final-final&#8221; dies here. You need semantic versioning across interdependent components: mesh v3.4 compatible with texture set v2.1 and rig v1.9, plus a provenance trail back to source captures. Without lineage, you&#8217;re shipping Franken-assets that render beautifully until a robot arm clips through a hinge because the collision mesh didn&#8217;t update with the material. The average user shrugs. Your safety team doesn&#8217;t.</p><p>Identity and permissioning? Folder ACLs crumble. Artists, scan techs, simulation engineers, ML teams, and legal all need different rights on different parts of the same object at different times. Write on staging, read on published, deny export from restricted geos, allow parameter edits but not texture swaps&#8212;this is policy-as-graph, not policy-as-folder. Anything less and you&#8217;ll either block the work or leak the crown jewels. Usually both.</p><p>Licensing and compliance are where most organizations quietly set themselves on fire. Third-party scans, museum collections, prop houses, and open libraries come with usage clauses: non-commercial, attribution, geo-restricted, time-bound, or export-controlled. Glue that to every derivative and enforce it across tools&#8212;or watch an innocent &#8220;test render&#8221; wander into an ad campaign. With 3D, downstream misuse isn&#8217;t theoretical; it&#8217;s embedded into pipelines, previews, and caches. If your platform doesn&#8217;t carry rights metadata end-to-end, you&#8217;ve built a lawsuit generator.</p><p>Performance and scale add insult to injury. These assets are heavy. Moving gigabytes across regions to placate a tool that insists on local copies is a cost and risk multiplier. Traditional &#8220;copy to project&#8221; workflows explode storage, fragment truth, and bury governance under duplicate snowdrifts. You think you have three bus models; you have nineteen, all slightly wrong.</p><p>Then there&#8217;s temporal truth. Digital twins aren&#8217;t static museum pieces; they change. Wear patterns, replaced parts, sensor calibrations, environment updates&#8212;time becomes a first-class dimension. Traditional systems fake this with folders named &#8220;Archive_2024_07.&#8221; Cute. Real governance tracks state changes as lineage events, preserves historical queries, and allows conditional policy: allow export of pre-2023 variants, quarantine post-2023 scans from SiteB pending audit.</p><p>Tool diversity is the final nail. Reality capture, DCC tools, game engines, simulation frameworks, ML training rigs&#8212;each speaks its own file dialect and metadata religion. If your governance requires every tool to behave, you&#8217;ve already lost. The platform must standardize identity, policy, and lineage above the tool layer, so Blender, Omniverse, Unity, and Spark can disagree about everything except who can do what, to which asset, where, and when.</p><p>This clicked for me when a team tried to &#8220;go fast&#8221; by bypassing policy to meet a demo date. They shipped a gorgeous model. Then legal discovered the base scan carried a non-export license. The fix wasn&#8217;t an apology; it was a full asset recall across four regions, retraining of a model that had ingested previews, and purging every derivative. Days lost because governance was optional. The thing most people miss is that 3D doesn&#8217;t tolerate optional. Either your platform enforces identity, lineage, classification, and policy by default, or the complexity will enforce chaos for you.</p><h2>Versioning and Provenance: Tracking the Life Cycle of a Digital Twin</h2><p>Versioning 3D twins isn&#8217;t renaming folders and hoping. It&#8217;s a governed narrative of cause and effect. The truth? Without tight provenance, you&#8217;re not iterating&#8212;you&#8217;re randomizing. So let&#8217;s wire this properly in Fabric, where identity, lineage, and policy ride along every change like a black box flight recorder.</p><p>Start with a canonical object definition&#8212;call it the Twin Manifest. It&#8217;s not a pretty PDF; it&#8217;s structured metadata in OneLake that references components by immutable IDs: source captures, mesh, textures, materials, rig, physics, and simulation parameters. Each component gets semantic versioning&#8212;major for breaking changes, minor for compatible improvements, build metadata for environment and toolchain. Mesh 3.4 works with Material Graph 2.1 and Collider 1.9. That compatibility table lives in the manifest, not in someone&#8217;s memory. Yes, average user, this is more work up front. It&#8217;s called engineering.</p><p>Now the provenance chain. Fabric lineage captures ingestion events from capture rigs into the Raw workspace&#8212;tagged with capture method (LiDAR, photogrammetry), device IDs, operator, location, and rights metadata. That&#8217;s your origin story. Processing pipelines promote to Staging with deterministic transformations: decimation, retopology, UV unwrap, baking, and LOD generation. Every step emits lineage edges: RawScan v1.2 &#8594; Mesh v.9 &#8594; LODSet v.3. When you publish, the manifest pins the exact graph state. If you rebuild with a new retopo algorithm, you don&#8217;t &#8220;overwrite.&#8221; You branch, you compare, you decide.</p><p>Here&#8217;s the shortcut nobody teaches: treat rights as versioned state, too. The license you captured under at SiteA v2023.10 is a component. When legal updates terms, you don&#8217;t scramble through drives; you query Fabric: show me all manifests referencing License:SiteA:2023.10. The dependency graph lights up. You bulk demote affected twins from Published to Quarantine, trigger reprocessing with allowed substitutions, and republish. Governance didn&#8217;t slow you down; it prevented weeks of forensic archaeology.</p><p>Let me show you exactly how teams work with this. Artists open the Staging shortcut in their DCC tool. They can bump Texture 2.1 to 2.2, but policy blocks changing the collision mesh in Published. Simulation engineers can tweak physics parameters within guarded ranges; crossing a threshold forces a new minor version with an approval workflow. Robotics consumes a frozen manifest via a shortcut&#8212;no downloading 90GB locally&#8212;so their build is reproducible. Analytics pulls lineage to explain why training performance jumped on Twin 3.4: the decimator improved edge preservation, not magic.</p><p>Common mistakes? Two classics. First, &#8220;final render&#8221; without pinning sources. You ship a Published twin pointing at &#8220;latest meshes.&#8221; Later, a mesh update breaks a compatibility contract. Result: beautiful demo, broken production. Pin exact versions in the manifest; &#8220;latest&#8221; is a ticking bomb. Second, silent toolchain drift. Someone updates a plugin; exports change. Embed toolchain hashes in build metadata and enforce them at pipeline time. If hashes don&#8217;t match, the job fails loudly. Painful now, cheaper than a recall.</p><p>Temporal reality matters. Twins age. Replace a part in the physical asset; you branch the digital twin. Fabric lets you annotate the manifest with effective dates and states: Pre-Repair, Post-Repair. Policies can then allow downstream use only for time-appropriate variants. Training models don&#8217;t accidentally learn obsolete geometry.</p><p>Finally, auditability. Fabric activity logs plus lineage produce a human-readable provenance: who changed what, when, why, and with which inputs. That&#8217;s defensible compliance and, frankly, professional hygiene. If you remember nothing else: version the manifest, pin dependencies, and treat rights as first-class, versioned components. The rest of your governance will stop feeling like theater and start behaving like engineering.</p><h2>Interoperability and Rights Management in the Metaverse</h2><p>Let&#8217;s address the fantasy first. You think &#8220;the metaverse&#8221; is one place. Incorrect. It&#8217;s a patchwork of engines, viewers, devices, file dialects, and business models that barely agree on gravity. Interoperability isn&#8217;t a feature; it&#8217;s survival. And rights management isn&#8217;t a footer on a contract; it&#8217;s the guardrail that keeps your assets from being cloned, remixed, and monetized by everyone except you.</p><p>The truth? If your 3D twin can&#8217;t move between Omniverse, Unity, Unreal, WebGL viewers, and downstream analytics without breaking identity, lineage, or licensing, you don&#8217;t have a metaverse strategy&#8212;you have vendor lock-in with extra steps. Fabric&#8217;s job is not to make Blender behave. Fabric&#8217;s job is to standardize identity, policy, and provenance above the tool layer so any engine can render, simulate, or stream while governance remains intact.</p><p>Enter open formats and logical storage. Keep canonical assets in OneLake; expose them through shortcuts and governed APIs. Use interoperable scene descriptions&#8212;OpenUSD where appropriate&#8212;so you exchange structure, materials, and references without exporting chaos. But remember: format doesn&#8217;t equal governance. The platform must inject labels, license terms, and usage constraints as first-class metadata that rides with the asset, is queryable, and is enforceable. Not a README. Enforceable.</p><p>Here&#8217;s the shortcut nobody teaches: rights as code. Model rights as machine-readable policies&#8212;who, where, when, how long, and for which derivative purposes. Tag the asset: License=Commercial; Territory=EU+US; Duration=2025-12-31; Derivatives=Render+Sim; Prohibit=Resale+Rehost. Fabric evaluates those claims at access time. Unity scene wants to pull the textures from Japan? Denied. A web viewer requests a downsampled stream for public display? Allowed if watermarking is enabled and attribution is injected. The policy isn&#8217;t a PDF that humans ignore; it&#8217;s a runtime decision.</p><p>Now, the interop dance. Engines expect local files; we don&#8217;t copy 90GB to every workstation like it&#8217;s 2012. Use cloud mounts, signed URLs, and streaming decoders that fetch only the needed LODs and tiles. Fabric issues time-bound tokens tied to identity and policy. When the token expires, the faucet closes. If legal revokes a license, lineage identifies every manifest and scene using that asset, the tokens are invalidated, previews are purged, and CI pipelines fail fast with human-readable reasons. Compare that to &#8220;We&#8217;ll fix it next sprint.&#8221; Lawyers love that phrase.</p><p>Attribution is not optional. Embed creator, source, and license in the manifest and enforce overlay attribution in viewers that support it. For engines that don&#8217;t, gate distribution behind a renderer or packaging step that bakes in credits or watermarks at the edges of allowed use. Fragile? No. Pragmatic. The average user thinks attribution is a checkbox. It&#8217;s a right.</p><p>Cross-platform identity is next. You authenticate with Entra ID. External partners federate via B2B, get scoped access to specific workspaces, and never see raw canonical stores. Platform-level scopes map to engine-level roles: Viewer, SceneAuthor, AssetPublisher. If a contractor leaves, access disappears without scrubbing shared drives for zombie files.</p><p>Common mistakes? Three favorites. One: exporting &#8220;just for a demo,&#8221; forgetting that demos leak. Two: handing partners ZIPs because &#8220;the pipeline is complicated,&#8221; which is how you lose control. Three: assuming OpenUSD alone solves rights. It doesn&#8217;t. It carries structure; Fabric carries law.</p><p>Finally, future-proofing. Your asset will live longer than any engine you use today. Keep truth in OneLake, treat engines as ephemeral clients, and codify rights so when the next platform arrives, you don&#8217;t re-litigate your library. If you remember nothing else: interop without rights is piracy with better UX; rights without interop is a museum. Fabric gives you both.</p><h2>The Ultimate Test: Applying Governance Frameworks to Real-Time 3D Assets</h2><p>Let&#8217;s graduate from theory to stress test. Real-time 3D isn&#8217;t &#8220;nice renders.&#8221; It&#8217;s dynamic, streamed, multi-user, policy-constrained interaction with high-fidelity objects&#8212;inside engines that expect speed, not paperwork. If Fabric governance holds here, it holds everywhere.</p><p>Start with the ingestion frontier. Capture rigs land thousands of images and LiDAR scans into a Raw workspace. Auto-classification applies: Source, Licensed, Region=EU, Origin=SiteB. A validation pipeline checks rights manifests, camera EXIF, sensor IDs, and hash integrity. Anything missing goes to Quarantine with a reason code humans can understand. That&#8217;s your first gate: quality, legality, and provenance enforced before anyone even opens a viewer.</p><p>Next, deterministic processing. Spark pipelines retopologize meshes, bake texture sets, generate LODs, and produce collider variants. Every step stamps lineage edges and pins toolchain hashes. Outputs are versioned, labeled Internal-Only until policy checks pass. The platform emits compatibility metadata&#8212;Mesh 3.4 &#8596; Materials 2.1 &#8596; Collider 1.9&#8212;into the manifest. You don&#8217;t rely on memory; you rely on metadata that compiles.</p><p>Publishing isn&#8217;t copying files to someone&#8217;s desktop. The canonical asset stays in OneLake. Teams get shortcuts into a Product workspace with curated derivatives: realtime-ready meshes, texture atlases, simplified colliders, and a governance-friendly OpenUSD scene. Access is role-scoped: Authors can update staging, Consumers read published, Partners get time-bound, region-bound reads via B2B federation. No mystery ZIPs. No &#8220;I&#8217;ll wetransfer it.&#8221; You either pass through the gate, or you wait outside.</p><p>Now the real-time pivot: streaming and tokens. Engines like Unity, Unreal, and Omniverse pull only what they need when they need it. Fabric mints signed URLs tied to Entra ID and policy claims: who, where, purpose, duration, derivative allowances. A scene requests LOD1 for a close-up? Allowed if attribution overlay is enabled and watermark present. A texture request originates from a blocked region? Denied with an explicit error and a lineage link. This is rights as code in motion&#8212;decisions at access time, not after a compliance meeting.</p><p>Multi-user collaboration turns governance into choreography. Two designers in different geos, one robotics engineer in a lab, and a producer on a laptop&#8212;editing the same digital twin. Session orchestration checks compatibility locks at the manifest layer. You can tweak physics within guardrails; you can&#8217;t swap a material that would violate export controls. If legal updates a license during the session, the change propagates. Tokens expire, assets are demoted, and the UI surfaces a clear reason. Not a silent failure&#8212;an enforced policy with receipts.</p><p>Performance is not an excuse to break governance. Stream tiled textures and mesh chunks; don&#8217;t duplicate canonical stores. Cache with eviction and respect labels. Pre-bake variants explicitly allowed by policy. If your scene creator &#8220;needs&#8221; a local copy of the 90GB source set to feel safe, the answer is no. You want real-time? Use streaming. You want compliance? Use metadata and tokens. You want both? Fabric.</p><p>Let&#8217;s make it painfully specific. Safety training scenario: a digital twin of an electric bus, 1:1 fidelity, with PPE inspection flow. The session pulls a Published manifest pinned to Mesh 3.4, Materials 2.1, Collider 1.9, Physics 1.2, License=Commercial, Territory=US+EU, Duration=2025-12-31. A trainee in Europe authenticates via Entra; the viewer requests needed assets. Fabric allows streaming with a public-display subset if watermarking is enabled. The trainer in the US edits an annotation, which writes to a governed Delta table referenced by the scene&#8212;lineage ties it to the session. An auditor later queries, &#8220;who viewed post-repair variant in Q2?&#8221; Answer arrives in seconds with a lineage graph, not a forensics novel.</p><p>Common pitfalls and the fix. Pitfall one: &#8220;preview assets&#8221; that bypass manifests. Fix: disable unsigned access, require manifests for any Published retrieval, and make the authoring tools fetch through the same APIs as viewers. Pitfall two: partner handoffs via ZIP. Fix: provision B2B identities, scope workspaces, and require tokenized access; build a one-click package that emits signed bundles with embedded licenses and timeouts if you truly need offline review. Pitfall three: ghost derivatives. Fix: pipelines must register outputs in a catalog item with retention and labels; unregistered files are auto-deleted or quarantined by policy.</p><p>Testing governance is non-negotiable. Build tabletop drills: revoke a license mid-sprint; rotate a region restriction; expire a token during a live session; push a breaking mesh update. Success isn&#8217;t &#8220;we found the email.&#8221; Success is the platform enforcing intent without heroics. Measure mean time to quarantine, percent of unauthorized requests correctly blocked, lineage completeness score, and delta between Published manifest and session-resolved assets. If those numbers aren&#8217;t boringly consistent, you&#8217;re not production-ready.</p><p>Finally, the loop back to analytics. Real-time scenes aren&#8217;t black boxes. Usage logs feed Fabric&#8217;s monitoring workspace. You learn which LODs cost you, which geos trigger denials, which partners push the limits, and which policies cause friction. You adjust&#8212;not by whisper network, but by iterating policies, manifests, and pipelines with data. Essentially, you govern the governance.</p><p>You want the one sentence version? Stream the twin, not the chaos. Tokens, manifests, lineage, and labels do the heavy lifting. If the hardest, highest-fidelity, real-time use case runs clean, every lesser workload will obediently follow.</p><h2>Conclusion: The Future of Digital Trust</h2><p>Here&#8217;s the blunt takeaway: digital trust isn&#8217;t a promise; it&#8217;s enforcement at runtime, with receipts. Real-time 3D just forces you to admit it. If identity, lineage, rights-as-code, and streaming governance can hold a 1:1 digital twin together under load, everything else you run is trivial by comparison.</p><p>So do the grown-up thing. Pin manifests. Treat licenses as versioned components. Stream with tokens. Federate partners. Drill revocations. And measure the boring metrics that prove policy isn&#8217;t theater. If this saved you time, repay the debt: subscribe, share this with the person still emailing ZIPs, and watch the next episode on Fabric policy patterns. Proceed.</p>]]></content:encoded></item><item><title><![CDATA[Stop Building Dumb Copilots: Why Agentic RAG Is Your Only Fix]]></title><description><![CDATA[Opening: Your Copilot Is Dumber Than You Think]]></description><link>https://newsletter.m365.show/p/stop-building-dumb-copilots-why-agentic</link><guid isPermaLink="false">https://newsletter.m365.show/p/stop-building-dumb-copilots-why-agentic</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Mon, 17 Nov 2025 17:16:18 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176689867/9f237409b0d70fd2f65662d794c3887d.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Opening: Your Copilot Is Dumber Than You Think</h2><p>Your Copilot isn&#8217;t smart. It&#8217;s well&#8209;dressed autocomplete&#8212;an over&#8209;caffeinated intern in a Microsoft badge who sounds confident while being utterly lost. The average admin installs it, asks one ambitious question like &#8220;Summarize last quarter&#8217;s sales across regions,&#8221; and then acts surprised when it responds with&#8230;&#8239;whatever happens to fit in its limited context window. That&#8217;s not insight. That&#8217;s statistical guesswork delivered in a friendly tone.</p><p>See, most so&#8209;called AI copilots run on something called retrieval&#8209;augmented generation&#8212;RAG for short. In theory, it&#8217;s brilliant: you ask a question, it searches a knowledge base, grabs relevant chunks, and glues them to your prompt so the language model looks informed. In practice? It&#8217;s like asking a single librarian for all human knowledge. She sprints down one aisle, grabs three random books, and yells the answer while running back. One query. One retrieval. One chance to be wrong.</p><p>Now contrast that with how actual enterprise decisions work. Do you ever need just one piece of data? No. You need the spreadsheet from Finance, the research report from SharePoint, the metrics warehouse in Microsoft Fabric, and usually some external market data that isn&#8217;t even in your tenancy. Classic RAG collapses the moment your truth lives in more than one place. It can&#8217;t plan multiple searches, can&#8217;t validate contradictions, and certainly can&#8217;t understand that &#8220;Quarterly performance&#8221; means different things to Marketing and Manufacturing.</p><p>Yet people keep calling these systems &#8220;intelligent.&#8221; Wrong. They&#8217;re context tourists. They visit your data estate, take a few selfies with PDFs, and pretend they know the city. Meanwhile, the &#8220;average admin&#8221; honestly believes Copilot has omniscient access to every SharePoint folder. It doesn&#8217;t. Unless you build explicit connectors and reasoners, it&#8217;s operating blindfolded.</p><p>This isn&#8217;t just inefficient&#8212;it&#8217;s dangerous. Without agentic retrieval, enterprises drown in context fragmentation. Decisions get made on partial data. Compliance risks go unnoticed. Teams chase hallucinated insights produced by a model that never bothered to double&#8209;check itself. The irony? The fix already exists.</p><p>Enter Agentic RAG. It doesn&#8217;t just fetch information; it thinks through it. It plans, cross&#8209;checks, and reasons like a digital research team. By the end of this episode, you&#8217;ll know exactly how to make your Copilot stop acting like a parrot and start behaving like a scientist. And yes&#8212;there are four steps. We&#8217;ll fix your dumb Copilot in four precise steps.</p><h2>Section 1: The RAG Myth &#8212; Why Linear Intelligence Fails</h2><p>Alright, let&#8217;s dissect the myth. Retrieval&#8209;Augmented Generation sounds sophisticated, but under the hood it&#8217;s brutally linear. Step one: retrieve a few slices of text based on vector similarity. Step two: stuff those slices into the prompt. Step three: generate an answer and declare victory. That&#8217;s it. No memory of previous searches, no reasoning about contradictions, no recognition of user context. It&#8217;s a straight line from query to answer&#8212;a glorified SQL join written in English.</p><p>The problem begins the moment reality gets messy. Say you ask, &#8220;Compare our device reliability with competitors.&#8221; A vanilla RAG system hits one index, grabs any document mentioning &#8220;reliability,&#8221; and spits out a summary. Did it check manufacturing logs in Fabric? Did it read that new testing report buried in SharePoint? Did it validate external data from the web? Of course not. It doesn&#8217;t even know those sources exist. It just paints over uncertainty with eloquence.</p><p>Think of it like a library analogy turned tragic. You walk in and ask one librarian about &#8220;global economics.&#8221; She runs to a shelf labeled &#8220;economics,&#8221; hands you a random book about currency exchange from 2012, and declares the question solved. Good customer service, terrible scholarship. Real intelligence would recruit multiple librarians&#8212;one for finance, one for history, one for policy&#8212;and then synthesize their findings. That&#8217;s the difference between retrieval and reasoning.</p><p>In enterprises, this failure multiplies. A single executive question often touches dozens of systems: SharePoint documents, Power BI datasets, Azure SQL tables, email threads. Classic RAG flattens all that complexity into a single hop. The result? Inconsistent outputs, shallow summaries, and hallucinated data phrased with confident diction. Regulatory compliance? Forget it. When the model pulls from whatever text happens to vector&#8209;match, you lose provenance. Try explaining that to your audit committee.</p><p>Yet the marketing around Copilot makes it sound omnipotent. The brochures whisper, &#8220;Ask anything; Copilot knows your business.&#8221; No, it doesn&#8217;t. It performs text retrieval with amnesia. It can&#8217;t plan, reflect, or verify. It doesn&#8217;t know which SharePoint site contains the right document, or whether the Fabric warehouse is even synchronized. But because the phrasing is smooth, executives assume comprehension where there is only correlation.</p><p>This illusion of intelligence is what companies are buying into&#8212;an expensive comfort blanket woven from probability distributions. They celebrate when Copilot drafts an email correctly, ignoring that it misunderstood the source data entirely. They brag about &#8220;AI&#8209;driven insights&#8221; without realizing those insights are assembled from mismatched contexts and partial snapshots.</p><p>Here&#8217;s the economic consequence: every mis&#8209;summarized report, every hallucinated KPI, cascades into poor decisions. Projects pivot based on fiction. Compliance teams chase ghosts. And when reality catches up&#8212;when the fabricated insight fails in production&#8212;the blame falls on &#8220;AI limitations,&#8221; not on the lazy architecture that ensured failure.</p><p>The truth? Linear intelligence fails because enterprises aren&#8217;t linear. Data is distributed, contextual, and often contradictory. A fixed one&#8209;query pipeline can&#8217;t adapt to that environment any more than a single neuron can think. What you need isn&#8217;t a better prompt; you need a system that can plan. One that can decide <em>which</em> services to use, <em>in what order</em>, and <em>how</em> to verify the outcome.</p><p>So, how do we teach a Copilot to operate like a research team instead of a parrot? That&#8217;s where Agentic RAG enters&#8212;the evolutionary leap from reactive retrieval to proactive reasoning. It adds layers of planning, specialized retrievers, and verification loops. In other words, it stops pretending to be smart and finally learns to think.</p><h2>Section 2: Enter Agentic RAG &#8212; From Search to Reasoning</h2><p>Here&#8217;s where we move from gimmick to intelligence. Agentic RAG isn&#8217;t another buzzword&#8212;it&#8217;s the missing faculty your Copilot was born without: executive function. Think of it as RAG that grew a prefrontal cortex. Instead of running one query and crossing its digital fingers, it breaks a problem into parts, assigns tasks to different &#8220;specialist&#8221; agents, checks their work, and then synthesizes the outcome. In short, it converts language models from parrots into planners.</p><p>Mechanically, Agentic RAG operates through <strong>multi&#8209;agent orchestration</strong>, built on Azure AI Agent Service. Picture three roles in motion. First, the <strong>Planner</strong>&#8212;a kind of digital project manager. The Planner reads your query and decides which tools or data sources are relevant. Then come the <strong>Retriever Agents</strong>&#8212;domain experts trained to access structured or unstructured data. Finally, the <strong>Verifier or Reasoner Agent</strong>, functioning as editor&#8209;in&#8209;chief, checks consistency, validates citations, and compiles the final response. Together, they run what we call an <strong>adaptive reasoning loop</strong>: query, retrieve, validate, refine, and act. The crucial word is <em>adaptive</em>. Unlike standard RAG, this loop doesn&#8217;t terminate at the first output&#8212;it reroutes when contradictions appear.</p><p>Compare this orchestrated dance to a newsroom. The Planner is the managing editor assigning beats: &#8220;You, check SharePoint for internal reports. You, pull the sensor metrics from Fabric. You, scan the web for competitor data.&#8221; Each Retriever Agent fetches its portion. The Verifier fact&#8209;checks the combined draft, re&#8209;runs queries if citations conflict, and only then publishes the summary. The result isn&#8217;t a blob of text that merely sounds plausible&#8212;it&#8217;s a coherent, evidence&#8209;linked insight. The leap here isn&#8217;t bigger models; it&#8217;s structured reasoning.</p><p>Let&#8217;s drill further into the <strong>Planner&#8217;s brain</strong>. It interprets your plain&#8209;English question into a task map: which retrievers to use, which order to run them in, and how their findings should merge. This is where the Azure AI Agent Service earns its existence. It provides the orchestration layer that lets these agents communicate&#8212;microservices that speak through APIs, governed by Microsoft Entra authentication, not guesswork.</p><p>Now, about <strong>security</strong>&#8212;because the average compliance officer is already reaching for the panic button. Agentic RAG doesn&#8217;t cut corners. It&#8217;s built around <strong>On&#8209;Behalf&#8209;Of authentication</strong>, meaning your identity travels with the request. The system doesn&#8217;t impersonate you; it uses your verified token to fetch only what you have permission to see. Row&#8209;Level Security (RLS) and Column&#8209;Level Security (CLS) come baked in. The AI can&#8217;t accidentally reveal the CFO&#8217;s forecast to an intern. Every retrieval call is logged, auditable, and reversible.</p><p>This matters, because static RAG has no concept of user context. It grabs whatever its search layer allows, often bypassing the enterprise&#8217;s permission scaffolding entirely. Agentic RAG restores that discipline. When the Fabric retriever queries a Lakehouse table, it enforces the same RLS rules your BI dashboards obey. When the SharePoint agent rummages through document libraries, it honors site&#8209;level permissions and Microsoft Purview labels. So the same policies that protect your human users now protect your AI ones.</p><p>Let&#8217;s fold this back into workflow reality. Suppose the question is: &#8220;Which glucose range does Product&#8239;A underperform compared to Product&#8239;B, and what&#8217;s the clinical impact?&#8221; Standard RAG will dump whatever snippets mention &#8220;Product&#8239;A&#8221; and &#8220;glucose.&#8221; Agentic RAG, powered by Azure AI Agent Service, would first have its Planner identify <strong>three retrieval fronts</strong>&#8212;Fabric for sensor data, SharePoint for clinical notes, and Bing for external publications. Each Retriever Agent brings in relevant evidence. The Verifier compares trends across datasets, flags discrepancies, maybe even refines the original Fabric query if an outlier appears. Only after validation does it synthesize the final insight&#8212;with citations intact. That&#8217;s iterative reasoning in action.</p><p>Reactive RAG stops after step one; Agentic RAG learns and adjusts mid&#8209;conversation. It can decompose follow&#8209;up questions automatically. Ask, &#8220;Can we improve accuracy using recent studies?&#8221; and the same agents pivot to fetch emerging materials without losing context. It&#8217;s continuous comprehension, not episodic memory loss.</p><p>The compliance bonus is enormous. Every agent&#8217;s action is traceable in audit logs, every token authenticated, every document touch logged. You get <strong>the illusion of omniscience with the paperwork of prudence</strong>&#8212;something auditors adore.</p><p>So the philosophical shift is this: retrieval alone provides information. Agency converts that information into process. By introducing planning, specialization, and verification, Azure&#8217;s Agent Service transforms random data pulls into accountable reasoning chains. In the enterprise world, that&#8217;s the difference between an assistant you trust and one you quietly disable.</p><p>Now that our Copilot has a functioning brain, it&#8217;s time to feed it a proper memory. In other words, let&#8217;s give it somewhere substantial to look&#8212;starting with the unstructured chaos of SharePoint.</p><h2>Section 3: Integrating SharePoint &#8212; Turning Chaos Into Knowledge</h2><p>SharePoint is where corporate knowledge goes to hide. Every enterprise has one&#8212;an archaeological dig site of PowerPoints, meeting notes, outdated specifications, and documents named &#8220;Final&#8209;V12&#8209;ReallyFinal.&#8221; To humans, it&#8217;s chaos. To a naive RAG system, it&#8217;s unreadable chaos. Keyword search dutifully returns a thousand results, most of them irrelevant, and the average user scrolls until morale improves. Then they ask Copilot for help, and Copilot promptly summarizes the wrong decade.</p><p>Agentic RAG treats SharePoint differently&#8212;not as a library but as a <strong>knowledge substrate</strong>. It knows that buried inside those folders are the qualitative insights that Fabric&#8217;s structured tables will never capture: context, decisions, rationale. So instead of running a single keyword sweep, the SharePoint retriever agent uses <strong>semantic embeddings</strong> and <strong>vector search</strong> to map meaning, not just text. Ask about &#8220;product reliability in humid environments,&#8221; and it doesn&#8217;t fixate on those exact words; it notices documents discussing failure modes, condensation resistance, and adhesive performance. It recognizes intent.</p><p>Here&#8217;s where permission awareness becomes the make&#8209;or&#8209;break feature. Every SharePoint site has its own tangled web of permissions&#8212;teams, sub&#8209;sites, confidential folders. A dumb crawler ignores that and accidentally surfaces HR grievances in a marketing report. The agentic model, however, authenticates <strong>on your behalf</strong>, inheriting your exact security context. It can only read what you&#8217;re cleared to see. The output is trimmed by policy automatically&#8212;<strong>security trimming</strong>, courtesy of Microsoft Entra and Purview labels. So the AI&#8217;s intelligence never outpaces its authorization.</p><p>Let&#8217;s run a practical scenario. An R&#8239;&amp;&#8239;D manager types, &#8220;Summarize performance differences of Product&#8239;A in coastal climates.&#8221; The Planner divides this into sub&#8209;quests. A Fabric retriever prepares to analyze numeric sensor data, while the SharePoint agent dives into internal research papers, maintenance logs, and engineering notes tagged with humidity&#8209;related terms. It finds a 2023 field&#8209;test report, a discussion thread about material corrosion, and a summarized findings document from the reliability team. Each document is vector&#8209;scored for semantic relevance, retrieved, and passed up to the Verifier agent. That Verifier cross&#8209;checks those qualitative results against Fabric numbers. If contradictions appear&#8212;say, an outdated document claims minimal corrosion&#8212;it flags the inconsistency and requests newer data. The final synthesized answer tells the R&#8239;&amp;&#8239;D manager precisely which assemblies degrade in high humidity and cites the validated sources.</p><p>What used to be several hours of manual digging now collapses into one continuous reasoning cycle. SharePoint shifts from a passive repository into an active participant in enterprise intelligence, essentially a <strong>neural memory</strong> of corporate decisions. The Agentic RAG layer doesn&#8217;t simply read documents; it learns relationships&#8212;project lineage, authorship trends, contextual clusters&#8212;and can thread them into coherent arguments.</p><p>Now, compliance officers may still twitch when they hear &#8220;autonomous retrieval.&#8221; Relax. Every query and document touch is logged. Audit trails remain intact. Regulatory frameworks such as ISO&#8239;27001 and GDPR depend on accountability, and this system provides it automatically. The agent can even attach metadata citing the document path and access timestamp to every generated phrase. That means every claim the AI makes can be traced back to a specific version of a file&#8212;<strong>non&#8209;repudiation for robots</strong>.</p><p>In short, integrating SharePoint under Agentic RAG turns content chaos into knowledge choreography. Your unstructured past becomes searchable by meaning, safeguarded by policy, and validated by cross&#8209;reference. SharePoint stops being a digital attic and becomes cognitive infrastructure. But qualitative context is only half the brain. The other half&#8212;the numeric, structured truth&#8212;lives within Microsoft Fabric, and that&#8217;s where we go next.</p><h2>Section 4: Microsoft Fabric &#8212; The Structured Counterpart</h2><p>Welcome to the other hemisphere of your enterprise brain&#8212;the structured side. If SharePoint stores your tribal knowledge, Microsoft&#8239;Fabric holds your empirical truth. It&#8217;s the unified analytics backbone where numbers, models, and event streams converge into something approximating coherence. Most organizations treat it as a data warehouse. Under Agentic&#8239;RAG, it becomes a <strong>reasoning substrate.</strong></p><p>Here&#8217;s the role Fabric plays: precision. It doesn&#8217;t speak anecdotes; it speaks telemetry, transactions, and time series. Within Fabric live the <strong>Lakehouse</strong>, the <strong>Warehouse</strong>, and the <strong>Semantic Model</strong>&#8212;each a different dialect of structure. A Fabric&#8239;Data&#8239;Agent, built atop Azure&#8239;AI&#8239;Agent&#8239;Service, translates natural language into structured queries that traverse those layers securely. Ask, &#8220;Show quarterly yield variance for Product&#8239;A by region,&#8221; and it quietly crafts an optimized SQL&#8209;like query targeting the right tables and partitions, executing against your authenticated context. No prompts, no Power&#8239;BI detours&#8212;direct, governed intelligence.</p><p>Now, raw access to numbers is meaningless without protection, so fabrication security isn&#8217;t an option; it&#8217;s architecture. Every interaction is encrypted and authenticated through <strong>Microsoft&#8239;Entra&#8239;ID</strong>, ensuring that the agent operates under your verified user token. Remember the chaos of service&#8209;principal shortcuts that ignore Row&#8209;Level&#8239;Security? Those are banned here. The On&#8209;Behalf&#8209;Of flow carries your identity end&#8209;to&#8209;end, enforcing <strong>RLS</strong> and <strong>Column&#8209;Level&#8239;Security</strong> automatically. If Finance marks a column confidential, the AI never glimpses it. And every execution leaves footprints in Fabric&#8217;s <strong>audit logs</strong>, satisfying auditors who treat logs as bedtime stories.</p><p>On top of that sits <strong>Purview governance.</strong> Sensitivity labels travel with the data&#8212;&#8220;Confidential,&#8221; &#8220;Internal&#8239;Only,&#8221; &#8220;Export&#8239;Restricted.&#8221; When the Fabric&#8239;Data&#8239;Agent composes a query using such fields, policies intercept instantly. Breach attempts trigger DLP enforcement before a single byte escapes. It&#8217;s essentially enterprise&#8209;grade baby&#8209;proofing for AI. The model can explore but not electrocute itself.</p><p>So what happens when we combine this structured discipline with the messy intuition of SharePoint? The Azure&#8239;AI&#8239;Agent&#8239;Service orchestrates it. Picture a courtroom: the Fabric agent supplies the hard evidence&#8212;charts, counts, sensor averages&#8212;while the SharePoint agent delivers the witness testimonies. The <strong>Verifier&#8239;Agent</strong> cross&#8209;examines them, ensuring the numbers and narratives align before presenting the verdict as a unified, citation&#8209;rich answer.</p><p>Let&#8217;s use an example. An operations lead asks, &#8220;Are we losing efficiency due to packaging defects?&#8221; The Planner dispatches the Fabric&#8239;Agent to retrieve yield rates by production line from the Warehouse. Simultaneously, it sends the SharePoint&#8239;Agent to scour maintenance logs and supplier correspondence. The Fabric&#8239;Agent returns a dataset showing minor dips correlating with humidity spikes. The SharePoint&#8239;Agent surfaces an email thread citing warped packaging materials during the same period. The Verifier corroborates both, labels the correlation credible, and the system drafts a concise finding&#8212;complete with quantitative graphs and referenced documents. Instant&#8239;Six&#8239;Sigma diagnostics, minus the sleepless analysts.</p><p>Under the hood, the Azure&#8239;AI&#8239;Agent&#8239;Service handles concurrency, batching retrievals through what&#8217;s effectively a microservice mesh. Each agent publishes a schema describing what it can access&#8212;Fabric schemas, SharePoint metadata, or Bing&#8217;s open web context. The Planner leverages that registry like an API directory. The result is modular intelligence: swap or extend agents as new data domains emerge without rewriting the entire Copilot.</p><p>Performance&#8209;wise, the innovation isn&#8217;t bigger models; it&#8217;s smarter retrieval order. The Planner may query Fabric first to define numerical boundaries, then use those to narrow SharePoint exploration. That reduces noise and accelerates convergence. Think of it as &#8220;data pruning through reason.&#8221; Instead of drowning in ten thousand documents, the system knows which ten matter because the numbers already framed the question.</p><p>Compliance officers adore this setup because governance scales with intelligence. Every agent call is logged, every transformation traceable. When the CFO asks, &#8220;Where did this number come from?&#8221; you can point directly to the Fabric table, the timestamp, and the executing user token. That transparency converts fear into trust&#8212;critical currency in regulated industries like finance or healthcare.</p><p>Combine these properties and you&#8217;ve built an analytical symphony: structured precision from Fabric harmonized with contextual understanding from SharePoint. The enterprise moves from &#8220;search and hope&#8221; to &#8220;retrieve, verify, decide.&#8221; And yes&#8212;the speed is startling.</p><h3>Transition</h3><p>Now combine this multitier recall with reasoning, and you get velocity&#8212;terrifying velocity. The research&#8209;to&#8209;decision cycle that once required a parade of analysts now collapses into hours. Which leads us directly to the final movement: impact.</p><h2>Section 5: The Enterprise Impact &#8212; From Months to Minutes</h2><p>Let&#8217;s talk consequences&#8212;the good kind. When you upgrade from passive RAG to Agentic&#8239;RAG across Fabric and SharePoint, the average enterprise timeline bends. What took months of reporting turns into minutes of verified synthesis. The AI no longer waits for humans to translate questions into data queries; it performs that translation, validation, and summarization automatically.</p><p>Consider R&#8239;&amp;&#8239;D. Teams used to assemble cross&#8209;functional committees to align on data: engineers exporting test metrics, analysts cleaning them, compliance checking permissions, and someone inevitably renaming files &#8220;final_final.&#8221; Agentic&#8239;RAG crushes that cycle. The Planner orchestrates agents that retrieve Fabric performance tables and SharePoint design notes simultaneously, merge them, and draft a validated summary&#8212;complete with citations and security labels. Decision latency? Nearly zero.</p><p>Compliance and audit experience similar shockwaves. Traditional audits meant emailing evidence packs for weeks. Now, the same AI that wrote the report can regenerate its reasoning trail on demand. Every retrieval call, query string, file path, and timestamp is recorded. Auditors can replay the exact steps leading to a conclusion, transforming due diligence from a scavenger hunt into a checkbox. What used to be a risk exposure becomes a governance jewel.</p><p>Manufacturing gains a predictive edge. Fabric&#8217;s quantitative streams reveal process deviations; SharePoint&#8217;s qualitative notes explain causes. The agentic loop correlates them before alerts escalate, effectively performing continuous improvement without a Six&#8239;Sigma consultant. Imagine replacing a room of overworked interns with a panel of expert consultants who <strong>never sleep, never forget context, and never exceed budget.</strong> That&#8217;s the operational equivalent of compounding intelligence.</p><p>Of course, automation only matters if it&#8217;s accountable. Agentic&#8239;RAG preserves every layer of enterprise inheritance&#8212;permissions, sensitivity labels, and audit logs&#8212;so CIOs can scale intelligence without scaling risk. Each insight is traceable to the user credential and governed repository that produced it. The system operates like a financial ledger for thought: transparent, reversible, and tamper&#8209;evident.</p><p>And the human cost? Reduced boredom. Professionals stop copy&#8209;pasting from exports and start interpreting synthesized truths. Meetings shorten because the AI arrives with pre&#8209;validated evidence. Projects accelerate because data and narrative converge instantly.</p><p>This is the part most executives miss: moving fast isn&#8217;t reckless when the reasoning is documented. The real recklessness is still building dumb copilots&#8212;single&#8209;shot, context&#8209;blind parrots masquerading as strategists. Those belong in the museum of early&#8209;AI curiosities, next to Clippy.</p><p>So, if your enterprise still celebrates a Copilot that only retrieves, congratulations&#8212;you&#8217;re funding a fancy autocomplete. The serious players are already using agents that plan, verify, and act. The regression from months to minutes is just the surface benefit. The deeper one is epistemic integrity&#8212;decisions that actually reflect reality because the intelligence constructing them&#8217;s held accountable.</p><p>This is why continuing to build dumb copilots isn&#8217;t merely inefficient&#8212;it&#8217;s reckless. The future of enterprise AI isn&#8217;t bigger prompts; it&#8217;s smaller feedback loops with better memory and governance. Agentic&#8239;RAG delivers both. Intelligence finally behaves like a system, not a stunt.</p><h2>Conclusion: Stop Building, Start Thinking</h2><p>RAG without agency is obsolete. It&#8217;s yesterday&#8217;s architecture pretending to handle tomorrow&#8217;s problems. The modern enterprise doesn&#8217;t need chatbots&#8212;it needs cognitive infrastructure, systems that can plan, verify, and act under your identity, not beside it. That&#8217;s Agentic&#8239;RAG: an ecosystem of deliberate reasoning built on Azure&#8239;AI&#8239;Agent&#8239;Service, speaking securely to SharePoint and Microsoft&#8239;Fabric like a team of experts sharing one authenticated brain.</p><p>If your Copilot still can&#8217;t schedule its own retrievals, validate references, or explain its reasoning trail, stop calling it intelligent&#8212;it&#8217;s decorative. Intelligence implies intent, verification, and consequence. Decorative AI performs monologues; Agentic&#8239;AI conducts experiments. The difference is accountability. One creates output. The other creates understanding.</p><p>This architectural shift isn&#8217;t optional anymore. The moment your decisions span structured and unstructured data, static RAG collapses. Compliance officers already know it, analysts already feel it, and leadership will soon demand proof of reasoning, not just confidence of tone. Microsoft&#8217;s stack finally provides the scaffolding: Azure&#8239;AI&#8239;Agent&#8239;Service for orchestration, Fabric&#8239;Data&#8239;Agents for quantitative truth, SharePoint&#8239;retrievers for context, and Purview governance sealing the whole nervous system.</p><p>So here&#8217;s your challenge: stop deploying show&#8209;ponies. Build agents that argue with themselves until they agree on truth. Experiment with multi&#8209;agent planning. Test On&#8209;Behalf&#8209;Of authentication. Wire Fabric and SharePoint together until your AI can actually defend its answers.</p><p>Because intelligence without action isn&#8217;t intelligence at all.</p><p>If this explanation clarified more than your vendor ever did, subscribe. The next deep dive deconstructs multi&#8209;agent design inside Microsoft&#8239;365&#8239;AI&#8212;how to make your Copilot not just attentive, but sentient within policy. Efficiency isn&#8217;t magic; it&#8217;s architecture. Lock in your upgrade path: subscribe, enable alerts, and let new insights deploy automatically. Proceed.</p>]]></content:encoded></item><item><title><![CDATA[Stop Paying for Cloud VMs: Run Azure on a Mini PC]]></title><description><![CDATA[Opening: The Cloud Bill Rebellion]]></description><link>https://newsletter.m365.show/p/stop-paying-for-cloud-vms-run-azure</link><guid isPermaLink="false">https://newsletter.m365.show/p/stop-paying-for-cloud-vms-run-azure</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Mon, 17 Nov 2025 05:11:38 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176689604/fe1daaba6950214496f22354f072193b.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Opening: The Cloud Bill Rebellion</h2><p>You&#8217;re still paying rent for machines you can&#8217;t touch. Think about that. Every month, the invoice from your cloud provider arrives like a landlord shaking you down for sunlight&#8212;charging you for compute cycles you don&#8217;t even remember scheduling. The total cost of your virtual machines could have bought you ten physical servers by now, but you keep paying because you assume the cloud is magic. Spoiler alert: it&#8217;s just someone else&#8217;s computer with better branding.</p><p>The cloud&#8217;s trick is convenience masquerading as innovation. You rent servers by the hour, and when you stop paying, they vanish&#8212;just like your sense of fiscal responsibility. What you&#8217;re really buying isn&#8217;t metal or silicon. You&#8217;re buying management, orchestration, remote control&#8212;essentially, a console to tell machines what to do.</p><p>Here&#8217;s the part people consistently misunderstand: that control panel, the glorified remote, can run in your environment just as easily as in Microsoft&#8217;s. And that&#8217;s where <strong>Azure Arc</strong> comes in. It&#8217;s the technology that breaks the illusion, letting you extend Azure&#8217;s management layer&#8212;its eyes and hands&#8212;to any device you own. Then <strong>Azure Local</strong> lets that device act like a full Azure region, except it sits on your desk, not in a data center a thousand miles away.</p><p>Same portal. Same security. Same policies. Zero per-hour compute bill. By the end of this explanation, you&#8217;ll understand exactly how Azure Arc convinces a humble mini PC that it&#8217;s part of Microsoft&#8217;s empire&#8212;and why that realization might end your monthly cloud tribute for good.</p><h2>Section 1: The Cloud Without the Cloud</h2><p>Let&#8217;s start by dismantling a myth. Azure isn&#8217;t just a warehouse of servers humming in synchronization. It&#8217;s two distinct layers: <strong>the hardware</strong> and <strong>the control plane</strong>. The control plane is the brain&#8212;you pay it to allocate workloads, enforce governance, monitor health, and sync policies. Hardware is just the muscle. When you rent a cloud VM, most of your bill goes not toward electricity or hardware depreciation, but toward that automated oversight machinery&#8212;Azure Resource Manager, Policy, Defender, and other services keeping your imaginary data center in check.</p><p>Now enter <strong>Azure Arc</strong>, the connective tissue that spreads that same brain across territories Microsoft doesn&#8217;t physically own. Arc lets you attach non-Azure servers, Kubernetes clusters, or even other clouds, and treat them as if they were native Azure citizens. Think of Arc as the <strong>universal remote control</strong>&#8212;the Logitech Harmony of cloud management. It doesn&#8217;t care if your device lives in Redmond or a broom closet; it speaks Azure to all of them.</p><p>When a machine becomes <strong>Arc-enabled</strong>, it essentially wears an Azure badge. It believes it belongs to the cloud. Policies apply, Defender protects, Monitor reports health&#8212;all through the same portal you already use. To your governance logs, it looks like any other Azure resource. The cloud shrinks down and follows the machine home.</p><p>Now layer on <strong>Azure Local</strong>, the next logical evolution. It&#8217;s what happens when you run actual Azure services&#8212;compute, network, and Kubernetes orchestration&#8212;on that Arc-managed machine. Instead of pretending to be a cloud, it becomes one. Think of it as tricking your old workstation into believing it just joined NASA&#8217;s compute cluster. All its local CPUs and storage now answer directly to Azure commands, but without the round-trip lag or metered pricing.</p><p>To make this click, picture Azure as a franchise. Microsoft operates the flagship stores, complete with power-hungry racks and ocean-cooled halls. Azure Arc is the franchising agreement that lets you open your own branch. Azure Local is your miniature storefront&#8212;same signs, same uniforms, different address. Customers can&#8217;t tell the difference.</p><p>The beauty here lies in symmetry. Every Arc-enabled system speaks Azure&#8217;s governance language&#8212;meaning policies, RBAC permissions, and compliance tagging are identical. You can deploy a VM to your mini PC through the Azure Portal with the same button you&#8217;d use for a VM in East US. The deployment logs, metrics, and identities register in one place. Centralized control, decentralized compute.</p><p>This inversion flips cloud economics on its head. You own the silicon, but Microsoft still handles the orchestration and updates. No more paying for idle VMs, because idle local cores cost you nothing but electricity. The cloud still manages everything&#8212;it just doesn&#8217;t meter your cycles.</p><p>Of course, there&#8217;s nuance. Azure Arc doesn&#8217;t magically transplant every cloud capability to your closet. You&#8217;re renting the brain, not the brawn. But for workloads that need local speed&#8212;AI inferencing, machine data processing, edge analytics&#8212;the ability to keep the computation onsite while maintaining Azure&#8217;s governance model is transformative.</p><p>And yes, the interface remains indistinguishable. You&#8217;ll still see your devices, clusters, and applications inside the familiar Azure Portal. The difference is physical geography, not operational capability. Azure Local gives you the illusion&#8212;and the benefits&#8212;of the cloud right next to your coffee mug.</p><p>So: the dream of Azure without the bill isn&#8217;t fiction. It&#8217;s simply a redistribution of where the hardware lives and who owns it. The next step is understanding how to pick the right hardware to host your private slice of the cloud&#8212;small, affordable, efficient machines that won&#8217;t melt your budget or your desk. That&#8217;s where the mini&#8209;PC revolution begins.</p><h2>Section 2: The Mini-PC Revolution</h2><p>So, you want to host Azure without a data center? Then you&#8217;ll appreciate how little hardware you actually need. Forget the mental picture of a server rack glowing like a Christmas tree. The minimum requirement is laughably small: one machine, virtualization support enabled, a boot disk, and a second solid-state drive for storage. Add power and Ethernet, and you&#8217;ve got yourself a regional compute node&#8212;barely louder than a desk fan.</p><p>The real constraint isn&#8217;t power; it&#8217;s <em>virtue</em>. The machine must support virtualization because Azure Local spins up both virtual machines and Kubernetes nodes under its supervision. Most modern mini PCs&#8212;anything with an Intel i5, i7, or AMD Ryzen and 16 to 32 gigabytes of RAM&#8212;are more than capable. In fact, engineers have done full demos using Intel NUCs and refurbished business desktops. You know those aging office towers everyone&#8217;s throwing away? Congratulations, they&#8217;re now ready to apply for Azure citizenship.</p><p>Researchers and experimenters have already tested these rigs: some fit in the palm of your hand, others in the space behind a monitor. One setup ran two Xeon-powered mini PCs, each with 64 GB of memory and a one&#8209;terabyte SSD. Together they replicated the functional brain of a small Azure region. And yes, it cost less than six months of cloud VMs running nonstop. You pay for the box once, and then never again.</p><p>Now, there&#8217;s an architectural elegance to this local deployment. Think of it as <em>shippable infrastructure</em>. In Microsoft&#8217;s demonstration, provisioning begins with a simple USB stick&#8212;a cryptographic passport of sorts. You boot the mini PC once, let the stub OS phone home, and it automatically enrolls. When it powers off, you remove the USB, claim the machine in Azure Arc, and there it is in your portal like any other server. Plug it, voucher it, claim it. The keyboard never even enters the conversation.</p><p>Picture the implications. A small retailer decides to deploy edge compute in fifty branch stores. Instead of hiring an IT team, they mail out pre&#8209;vouchered mini PCs. The employee on site does one thing: connects power and Ethernet. Within minutes, headquarters sees the machine appear in the Azure console, ready to receive policies and workloads. The branch associates never log in, never know there&#8217;s an internal Kubernetes cluster doing AI camera analysis above the cash register. Behind the scenes, it&#8217;s all Azure&#8212;Arc&#8209;managed, remotely configured, completely oblivious to geography.</p><p>The environmental and economic logic are irresistible. This tiny machine consumes less than 50 watts at full load. There&#8217;s no noisy cooling, no colocation rent, no e&#8209;waste cascade every refresh cycle. When you inevitably upgrade, the old one becomes a backup node or a lab system. Green computing by accident, not committee.</p><p>From a performance standpoint, you sacrifice surprisingly little. Local workloads benefit from zero latency and direct access to onsite data. Your only &#8220;network delay&#8221; is the one between your machine and its wall socket. And because Arc centralizes management, you can still apply policies, monitor performance, and push updates without standing next to it.</p><p>What emerges is a kind of <em>democratization of cloud hardware</em>. The same Azure fabric that powers multinational operations now runs inside small offices, retail outlets, manufacturing floors&#8212;on devices you could stack like paperback novels. The cloud&#8217;s footprint shrinks, but its control remains identical.</p><p>So, by now you have your infrastructure&#8212;small, silent, cost&#8209;controlled. But there&#8217;s a trap lurking, and it has three letters: A&#8209;D. Active Directory, the overgrown vine of enterprise identity, threatens to choke your minimalism. In the next part, we convert that medieval bureaucracy into something elegant: certificate&#8209;based identity through Azure Key Vault, the modern way to log into your local cloud without building a cathedral just to flip a switch.</p><h2>Section 3: Escaping the AD Trap</h2><p>Active Directory was brilliant in 1999. It was also designed for an era when servers were beige, users were predictable, and every device lived on the same carpeted subnet. Today, forcing AD into a two&#8209;node edge deployment is a crime against efficiency. Building a domain forest just so two machines can handshake is like constructing an entire cathedral to power a desk lamp&#8212;solemn, expensive, and completely unnecessary. And yet, that&#8217;s what most sysadmins still do because tradition says identity must come with a forest, a flock, and a sacrifice to DNS.</p><p>The problem is that AD assumes centralization. It expects a domain controller somewhere issuing permissions like a digital monarch. But your shiny new Azure Local setup has no patience for monarchy. These are small, distributed, sometimes offline environments&#8212;the kinds that shouldn&#8217;t depend on a single sign&#8209;on temple hundreds of miles away. You need something lighter, faster, and entirely self&#8209;contained.</p><p>Enter <strong>Local Identity with Azure Key Vault</strong>, an approach so refreshingly obvious you&#8217;ll wonder why Microsoft didn&#8217;t market it as &#8220;Active Directory Detox.&#8221; Instead of herding passwords and replication rules, you issue certificates&#8212;mathematically signed trust documents that machines can verify without ever phoning a domain controller. Each node keeps its credentials local but synchronized through Key Vault, which acts as the central, cloud&#8209;backed safe for all your secrets.</p><p>Here&#8217;s how it changes your life: Key Vault replaces the constant AD heartbeat with an occasional, secure whisper. It stores things like the cluster certificates, encryption keys, BitLocker secrets, and admin credentials in one auditable store. The machines authenticate with those certificates to each other, no replication schedules, no account policies, no domain functional level compatibility quizzes. You get modern zero&#8209;trust&#8209;style authentication without the baroque ceremony of a forest.</p><p>The humor writes itself. For every administrator who ever waited through a 45&#8209;minute AD schema update just to grant one service account, this is sweet vindication. You click &#8220;Local Identity with Key Vault&#8221; during Azure Local deployment, select your subscription&#8217;s vault, and that&#8217;s it. The machines generate their local identities from that vault. Permissions propagate instantly because&#8212;brace yourself&#8212;there&#8217;s no domain to replicate. The system&#8217;s leaner, quieter, and paradoxically more secure because it has fewer moving parts to forget.</p><p>Consider the compliance angle. Key Vault is already an audited service, integrated with Azure Policy and Monitor. So when a regulator asks where credentials live, you can answer confidently: &#8220;Inside my Key Vault, encrypted under Microsoft&#8209;managed HSMs, with role&#8209;based access logged centrally.&#8221; Try giving that answer with a homegrown AD that half your technicians forgot to patch in 2021. In Azure Local, certificate rotation and recovery are controlled from the same portal as everything else. Lose a node? Re&#8209;issue its cert from Key Vault. Lose all nodes? Restore from Key Vault backups. No domain rebuilds, no DNS scavenging, no prayers to FSMO gods.</p><p>Now, the skeptic might ask: &#8220;Isn&#8217;t AD still more feature&#8209;rich?&#8221; Technically, sure. If your idea of richness is manually adjusting Group Policy for IE settings on a kiosk that doesn&#8217;t even run Windows anymore. For our edge scenario, the minimalist Key Vault model is pure liberation. It&#8217;s agile enough for a two&#8209;machine deployment and robust enough for dozens of sites, all without the administrative cholesterol.</p><p>Governance doesn&#8217;t suffer either. Arc reports every identity operation to Azure, so audit logs remain unified. Businesses can maintain zero&#8209;trust compliance and prove chain&#8209;of&#8209;custody from the same dashboard that deploys their containers. You finally decouple identity from heavy infrastructure while keeping full traceability&#8212;a clean severance of control without chaos.</p><p>So, identity solved. No Domain Controllers. No replication. No spiritual crises over trust relationships. Your Azure Local cluster now wakes up, authenticates using certificates from Key Vault, and behaves with the politeness of a perfectly trained valet&#8212;secure, quiet, and predictably obedient.</p><p>And with bureaucracy gone, you can focus on something that actually matters: running workloads. Because a local Azure region with perfect identity but zero useful applications is like a Ferrari without fuel&#8212;an object of admiration, not motion. Next, we&#8217;ll fire it up, deploy your private Azure region from the same portal interface, and prove that your tiny cluster isn&#8217;t just registered&#8212;it&#8217;s alive.</p><h2>Section 4: Deploying Your Own Private Azure Region</h2><p>Now we reach the part where the illusion becomes reality&#8212;where a couple of small machines stop pretending and start behaving like a legitimate Azure region. No, not a counterfeit&#8212;it&#8217;s an officially recognized outpost. Azure Arc takes your hardware, blesses it with certificates, and welcomes it to the empire. What happens next is equal parts engineering and sorcery.</p><p>The process starts with what Microsoft calls &#8220;zero&#8209;touch provisioning.&#8221; Translation: you plug in power and Ethernet and walk away. A special USB stick performs what amounts to digital baptism. It contains a lightweight bootstrap OS whose singular purpose is to call home, authenticate, and retrieve the deployment payload. Once powered, the machine reads the certificate voucher on that USB, verifies it against Azure, and announces, &#8220;I&#8217;m yours now.&#8221; Three minutes later it powers off&#8212;installation complete, eyes open.</p><p>Back at the Azure Portal, under Arc&#8217;s <strong>Provisioning</strong> tab, those freshly awakened nodes appear with serial numbers identical to their vouchers. You upload the corresponding voucher files, proving ownership, then categorize them into what Azure calls a <em>site</em>&#8212;essentially a local region name like &#8220;Redmond&#8221; or &#8220;Berlin.&#8221; It feels ceremonial, like naming your first pet data center. From there, the cloud finishes the hard work&#8212;downloading the full operating system image you selected (24H2, for example), configuring storage, hardening security baselines, and registering the node as a fully Arc&#8209;enabled machine. You set administrator credentials, pick your IP schema, and watch progress bars like a proud parent.</p><p>Here&#8217;s where elegance meets physics. Those two tiny boxes now greet each other as cluster peers. Azure Arc configures their internal networking, defines logical subnets, and synchronizes storage replication so that a VM on one can live&#8209;migrate to the other in seconds. No SANs, no fibre channel melodrama&#8212;just Ethernet and trust. Because that Key Vault identity system you configured earlier provides the certificates for replication, none of this requires Active Directory. Each node knows its sibling, validates it cryptographically, and proceeds to behave like part of a larger Azure infrastructure.</p><p>It gets better. From the same Portal where you&#8217;d deploy a multi&#8209;million&#8209;dollar virtual network, you now click <strong>Deploy Azure Local</strong>. You name the instance&#8212;perhaps something dignified like &#8220;Local&#8209;01&#8221;&#8212;select your provisioned machines, and let validation run. Azure checks firmware compatibility, network latency, and storage throughput. If all green, the deployment spins up the local control plane components: resource providers for compute, network, and storage services, the local orchestrator, and AKS (Azure Kubernetes Service) on top.</p><p>This is the part where the average user&#8217;s brain melts slightly. You can now create a <strong>virtual machine</strong> or a <strong>Kubernetes cluster</strong> right here, and it shows up in your Azure portal alongside resources from East US, West Europe, and anywhere else. Yet physically, it&#8217;s sitting near your keyboard, humming politely. The same RBAC policies, cost tags, and monitoring metrics apply. Azure Monitor sees CPU utilization, logs events, and Defender scans for threats&#8212;all as if these nodes lived in a Microsoft facility.</p><p>It&#8217;s automation theatre of the highest order. You spend an hour watching the provisioning workflow&#8212;networking, storage pools, role assignments&#8212;and when it finishes, you refresh your Azure Arc dashboard. Title line reads: <em>Azure Local deployment succeeded.</em> Below it: two healthy machines, one cluster, zero workloads. Your miniature region is born.</p><p>Now, let&#8217;s talk workloads. You navigate to &#8220;Virtual Machines,&#8221; click &#8220;Create,&#8221; and follow a nearly identical wizard to the public cloud. Choose an image, set vCPU and memory, and within minutes, the VM materializes on your local storage. You can even migrate existing VMs from another platform by importing them through Azure Migrate or just uploading their disks. They&#8217;ll replicate between your two local nodes for live migration, achieving availability levels that would make your old Hyper&#8209;V lab blush.</p><p>Or, if you prefer Kubernetes, Azure Local comes with AKS pre&#8209;wired. You define a logical network, give it an IP range, and deploy clusters that operate side&#8209;by&#8209;side with VMs. GitOps integration means any application changes pushed to your repository automatically redeploy here with every commit. Update your AI inferencing model, push to Git, and seconds later the new container spins up locally&#8212;no human required.</p><p>Microsoft&#8217;s own demo shows an AI video processing app operating exactly this way&#8212;analysing camera feeds onsite, performing inferencing locally to avoid latency, and updating directly from GitHub. The AI doesn&#8217;t travel to the cloud; the cloud&#8217;s brain travelled to the AI. Retailers love this because customers refuse to wait for a remote frame analysis before they&#8217;re served. Factories adore it because predictive maintenance works only if your inference happens before something breaks.</p><p>And running it all locally means no outgoing bandwidth cost for constant video streaming, no dependency on the nearest Azure region&#8217;s uptime, and most importantly, a cloud bill that finally stops resembling a casino receipt. It&#8217;s controlled, elegant, and entirely under your jurisdiction.</p><p>So now your local region breathes, computes, and updates with cloud parity. The system works. The next obvious question&#8212;one that every CFO is about to ask&#8212;is painfully simple: does this actually save money, or have we just reinvented expensive toys? That, dear listener, is where economics and rebellion finally meet.</p><h2>Section 5: The Economics of Taking the Cloud Home</h2><p>Here&#8217;s where fantasy meets finance. Everyone loves technical wizardry until the invoice arrives. In the public cloud, that&#8217;s the moment when joy turns to regret&#8212;the same way someone feels when they check their in&#8209;app purchases after a long weekend. Running VMs in Azure sounds cheap until you realize it&#8217;s a 24&#8209;hour meter sticking out of your wallet. Those micro&#8209;charges accumulate like dust bunnies in a data center vent.</p><p>Let&#8217;s dissect the cost model that this &#8220;mini&#8209;region&#8221; upends. In the cloud, you&#8217;re paying for <strong>compute time</strong>&#8212;every CPU cycle, every gigabyte of storage, every inbound and outbound byte. The meter never sleeps. But when you move that same workload onto <strong>Azure Local</strong>, the economics pivot. You purchase physical hardware once, connect it through <strong>Azure Arc</strong>, and keep the management layer&#8212;which is the valuable part&#8212;without renting the underlying metal forever.</p><p>Here&#8217;s the blunt math. Azure Arc&#8217;s <strong>core registration</strong> is free. Once you attach a machine, it behaves like an Azure asset: policies, Defender alerts, monitoring, and log integration all function identically. The only time you start paying is if you enable optional services like <strong>Microsoft Defender for Cloud</strong>, <strong>Azure Policy</strong>, or <strong>Monitor</strong>&#8212;each billed per-core or per-gigabyte of data ingested. In other words, you pay for governance and visibility, not computation.</p><p>Contrast that with a standard VM bill. Take a modest, always&#8209;on four&#8209;core instance in an Azure region. Between compute, storage, and traffic, you&#8217;ll hit hundreds of dollars a month. Multiply that by a few small VMs, tack on data transfer fees, and congratulations&#8212;you&#8217;ve spent more renting cycles than buying silicon. With Azure Local, a one&#8209;time outlay on a capable mini PC&#8212;say $700 for something with a Xeon or Ryzen CPU and a terabyte SSD&#8212;covers years of duty. Even adding electricity, you&#8217;re below the cost of a single quarter&#8217;s worth of cloud runtime.</p><p>And yes, corporate accountants adore this because it turns cloudy <strong>Opex</strong> into predictable <strong>Capex</strong>. No surprise invoices, no &#8220;spike&#8221; because a single container looped infinitely. Stability may not sound sexy, but it pays the bills. The cloud sells elasticity. Most organizations secretly crave reliability.</p><p>Operationally, you haven&#8217;t lost the good parts of Azure economics, either. Arc&#8209;enabled devices still let you apply <strong>pay&#8209;as&#8209;you&#8209;go licensing</strong> for Windows Server or SQL if you want flexibility. You can start with existing licenses under Software Assurance or switch to usage&#8209;based pricing if your workloads fluctuate. You choose which knobs to turn, not the provider.</p><p>Then comes the hybrid beauty. Because your mini PC sits under Azure management, you can still enable selective premium services&#8212;a Defender scan here, a specific Policy compliance check there. You compose your own pricing model like ordering &#224; la carte instead of accepting the expensive &#8220;all&#8209;you&#8209;can&#8209;compute&#8221; buffet. It&#8217;s governance with portion control.</p><p>Let&#8217;s indulge one skepticism: power and replacement costs. True, physical hardware ages. But these small devices consume trivial energy&#8212;forty to fifty watts, less than a lightbulb from the era when AD made sense. Over three years, the power cost barely equals one month of cloud uptime for comparable compute. When hardware fails, you replace it, re&#8209;voucher it, and Azure automatically redeploys workloads via Arc and GitOps. That&#8217;s not downtime; that&#8217;s routine maintenance.</p><p>Here&#8217;s the subtle but profound psychological change: ownership. When you host cloud services locally, you regain physical awareness of your infrastructure. You know what&#8217;s deployed, where it sits, and who can touch it. The illusion of infinite hardware dissolves, replaced by tangible stewardship. This accountability often leads to smarter provisioning&#8212;less sprawl, more optimization. Ironically, taking the cloud home teaches restraint.</p><p>Scaling this model outward is straightforward. A factory adds another node for AI inspection; a retail chain ships two machines per store for edge analytics; a healthcare provider drops one in each clinic for offline resilience. Every site functions as a self&#8209;contained, Arc&#8209;governed enclave, reporting metrics like any Azure region. Central IT still enforces global Policy and Security Center dashboards across them all. You end up with orchestration unity and cost isolation&#8212;a rare pairing.</p><p>Some executives need a metaphor to digest it, so here&#8217;s one: Cloud&#8209;Only is perpetual car rental. Azure Local via Arc is buying the car and letting Microsoft manage traffic lights, navigation, and insurance. You drive; they regulate. You stop paying when you park.</p><p>And you will park more often&#8212;because now you can. Your workloads aren&#8217;t bleeding money while idle. You brought the compute home, but left the headaches offshore.</p><p>Still think cloud rebellion sounds reckless? Microsoft would politely disagree&#8212;it built Azure Local for exactly this reason. The company knows customers want centralized control without constant metering. The difference is geographic sovereignty and billing autonomy: Azure stays the brain, you own the body.</p><p>The financial conclusion writes itself. For stable, long&#8209;running workloads or predictable operations, the local approach wins outright. For bursty or global-scale tasks, the public cloud remains useful. But combining the two gives businesses the best of both worlds&#8212;elastic management, static expenses. That&#8217;s not anti&#8209;cloud; that&#8217;s intelligent hybridization.</p><p>At this point, you&#8217;ve inverted the model. Azure once charged you for computing under its roof; now it supervises while you compute under yours. That shift&#8212;subtle, technical, and bureaucratically scandalous&#8212;redefines IT budgeting. The rebellion pays dividends.</p><p>Which brings us full circle: you no longer depend on the landlord. You own the house, you still get mail from Azure, and the monthly rent line on your budget finally goes silent.</p><h2>Conclusion: The Cloud Is Now Personal</h2><p>So here&#8217;s the epilogue of this rebellion: you don&#8217;t abandon the cloud; you domesticate it. Azure still governs, authenticates, and observes, but the humming engine lives ten centimeters from your mouse pad. The great migration to the cloud has quietly reversed direction&#8212;not retreating, just maturing. We stopped renting the sky and started installing fragments of it in our offices.</p><p>The advantages align perfectly with common sense. Fixed hardware cost replaces perpetual billing. Identity becomes certificate&#8209;clear, not policy&#8209;muddy. Compliance stays centralized, but performance moves local. You have the same Azure Portal, the same Defender shields, the same Governance dashboard&#8212;everything except the unpredictable finance department tears.</p><p>The philosophical twist is this: the cloud was never somewhere else. It was always a management idea, not a place. By owning hardware and letting Azure Arc administer it, you&#8217;ve proved that control and economics can coexist. You can be sovereign and compliant at the same time.</p><p>Your data center now fits in a shoebox. It updates like a region, scales like Kubernetes, and hums quietly beside your keyboard. (Pause.) Yes, it still runs Azure.</p><p>Lock in your upgrade path: subscribe, enable notifications, and let each new episode deploy automatically&#8212;like a well&#8209;scheduled pipeline maintaining continuous delivery of comprehension. Efficiency isn&#8217;t an accident; it&#8217;s a subscription habit. Proceed accordingly.</p>]]></content:encoded></item><item><title><![CDATA[Stop Typing to Copilot: Use Your Voice NOW!]]></title><description><![CDATA[Opening: The Problem with Typing to Copilot]]></description><link>https://newsletter.m365.show/p/stop-typing-to-copilot-use-your-voice</link><guid isPermaLink="false">https://newsletter.m365.show/p/stop-typing-to-copilot-use-your-voice</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Sun, 16 Nov 2025 17:04:32 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176688309/da2c42a0546174efc24188f930b921aa.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Opening: The Problem with Typing to Copilot</h2><p>Typing to Copilot is like mailing postcards to SpaceX. You&#8217;re communicating with a system that processes billions of parameters in milliseconds&#8212;and you&#8217;re throttling it with your thumbs. We speak three times faster than we type, yet we still treat AI like a polite stenographer instead of an intelligent collaborator. Every keystroke is a speed bump between your thought and the system built to automate it. It&#8217;s the absurdity of progress outpacing behavior.</p><p>Copilot is supposed to be <em>real-time</em>, but you&#8217;re forcing it to live in the era of QWERTY bottlenecks. Voice isn&#8217;t a convenience upgrade&#8212;it&#8217;s the natural interface evolution. Spoken input meets the speed of comprehension, not the patience of typing. And now, thanks to Azure AI Search, GPT&#8209;4o&#8217;s Realtime API, and secure M365 data, that evolution doesn&#8217;t just hear you&#8212;it understands you, instantly, inside your compliance bubble.</p><p>There&#8217;s one architectural trick that makes all this possible. Spoiler: it&#8217;s not the AI. It&#8217;s what happens between your voice and its reasoning engine. We&#8217;ll get there. But first, let&#8217;s talk about why typing is still wasting your time.</p><div><hr></div><h2>Section 1: Why Text Is the Weakest Link</h2><p>Typing is slow, distracting, and deeply mismatched to how your brain wants to communicate. The average person types around forty words per minute. The average speaker? Closer to one hundred and fifty. That&#8217;s more than a threefold efficiency loss before the AI even starts processing your request. You could be concluding a meeting while Copilot is still parsing your keyboard input. The human interface hasn&#8217;t just lagged&#8212;it&#8217;s actively throttling the intelligence we&#8217;ve now built.</p><p>And consider the modern enterprise: Teams calls, dictation in Word, transcriptions in OneNote. The whole Microsoft 365 ecosystem already revolves around speech. We talk through our work&#8212;the only thing we don&#8217;t talk <em>to</em> is Copilot itself. You narrate reports, discuss analytics, record meeting summaries, and still drop to primitive tapping when you finally want to query data. It&#8217;s like using Morse code to steer a self-driving car. Technically possible. Culturally embarrassing.</p><p>Typing isn&#8217;t just slow&#8212;it fragments attention. Every time you break to phrase a query, you shift cognitive context. The desktop cursor becomes a mental traffic jam. In productivity science, this is called &#8220;switch cost&#8221;&#8212;the tiny lag that happens when your brain toggles between input modes. Multiply it by hundreds of Copilot queries a day, and it&#8217;s the difference between flow and friction.</p><p>Meanwhile, in M365, everything else has gone hands-free. Teams can transcribe in real time. Word listens. Outlook reads aloud. Power Automate can trigger with a voice shortcut. Yet the one place you actually want real conversation&#8212;querying company knowledge&#8212;still expects you to stop working and start typing. That&#8217;s not assistance. That&#8217;s regression disguised as convenience.</p><p>Here&#8217;s the irony: AI understands nuance better when it hears it. The pauses, phrasing, and intonation of speech carry context that plain text strips away. When you type &#8220;show vendor policy,&#8221; it&#8217;s sterile. When you <em>say</em> it, your cadence might imply urgency or scope&#8212;something a voice-aware model can detect. Text removes humanity. Voice restores it.</p><p>This mismatch between intelligence and interface defines the current Copilot experience. You have enterprise-grade reasoning confined by nineteenth&#8209;century communication habits. It&#8217;s not your system that&#8217;s slow&#8212;it&#8217;s your thumbs. And if you think a faster keyboard is the answer, congratulations: you&#8217;ve optimized horse saddles for the automobile age.</p><p>To fix that, you don&#8217;t need more shortcuts or predictive text. You need a Copilot that listens as fast as you think. That understands mid-sentence intent and responds before you finish talking. You need a system that can hear, comprehend, and act&#8212;all without demanding your eyes on text boxes.</p><p>Enter voice intelligence. The evolution from request-response to real conversation. And unlike those clunky dictation systems of the past, the new GPT&#8209;4o Realtime API doesn&#8217;t wait for punctuation&#8212;it works in true dialogue speed. Because the problem was never intelligence. It was bandwidth. And the antidote to low bandwidth is&#8230; speaking.</p><h2>Section 2: Enter Voice Intelligence &#8212; GPT&#8209;4o Realtime API</h2><p>You&#8217;ve seen voice bots before&#8212;flat, delayed, and barely conscious. The kind that repeats, &#8220;I didn&#8217;t quite catch that,&#8221; until you surrender. That&#8217;s because those systems treat audio as an afterthought. They wait for you to finish a sentence, transcribe it into text, and <em>then</em> guess your meaning. GPT&#8209;4o&#8217;s Realtime API does not guess. It listens. It understands what you&#8217;re saying before you finish saying it. You&#8217;re no longer conversing with a laggy stenographer; you&#8217;re talking to a cooperative colleague who can think while you speak.</p><p>The technical description is &#8220;real&#8209;time streaming audio in and out,&#8221; but the lived experience is more like dialogue. GPT&#8209;4o processes intent from the waveform itself. It isn&#8217;t translating you into text first; it&#8217;s digesting your meaning as sound. Think of it as semantic hearing&#8212;your Copilot now interprets the point of your speech before your microphone fully stops vibrating. The model doesn&#8217;t just hear <em>words</em>; it hears <em>purpose</em>.</p><p>Picture this: an employee asks aloud, &#8220;What&#8217;s our current vendor policy?&#8221; and gets an immediate, spoken response: &#8220;We maintain two approved suppliers, both covered under the Northwind compliance plan.&#8221; No window-switching. No menus. Just immediate retrieval of corporate memory, grounded in real data. Then she interrupts midsentence&#8212;&#8220;Wait, does that policy include emergency coverage?&#8221;&#8212;and the system pivots instantly. No sulking, no restart, no awkward pause. It simply adjusts, mid&#8209;stream, because the session persists continuously through a low&#8209;latency WebSocket channel. Conversation, not command syntax.</p><p>Now, don&#8217;t confuse this with the transcription you&#8217;ve used in Teams. Transcription is historical&#8212;it converts speech <em>after</em> it happens. GPT&#8209;4o Realtime is predictive. It starts forming meaning <em>during</em> your utterance. The computation happens as both parties talk, not sequentially. It&#8217;s the difference between reading a book and finishing someone&#8217;s sentence.</p><p>Technically speaking, the Realtime API works as a two&#8209;way audio socket. You stream your microphone input; it streams its synthesized voice back&#8212;sample by sample. The latency is measured in tenths of a second. Compare that to earlier voice SDKs that queued your audio, processed it in batches, and then produced robotic, late replies. Those were glorified voicemail systems pretending to be assistants. This is a live duplex conversation channel&#8212;your AI now breathes in sync with you.</p><p>And yes, you can interrupt it mid&#8209;answer. The model rewinds its internal context and continues, as though acknowledging your correction. It&#8217;s less like a chatbot and more like an exceptionally polite panelist. It listens, anticipates, speaks, pauses when you speak, and carries state forward.</p><p>The beauty is that this intelligence doesn&#8217;t exist in isolation. The GPT portion supplies generative reasoning, but the Realtime layer supplies timing and tone. It turns cognitive power into conversation. You aren&#8217;t formatting prompts; you&#8217;re holding dialogue. It feels human not because of personality scripts, but because latency finally dropped below your perception threshold.</p><p>For enterprise use, this changes everything. Imagine sales teams querying CRM data hands&#8209;free mid&#8209;call, or engineers reviewing project documents via voice while their hands handle hardware. The friction evaporates. And because this API outputs audio as easily as it consumes it, Copilot gains a literal voice&#8212;context&#8209;aware, emotionally neutral, and fast.</p><p>Of course, hearing without knowledge is still ignorance at speed. Recognition must be paired with retrieval. The voice interface is the ear, yes, but an ear needs a brain. GPT&#8209;4o Realtime gives the Copilot presence, cadence, and intuition; Azure AI Search gives it memory, grounding, and precision. Combine them, and you move from clever echo chamber to informed colleague.</p><p>So, the intelligent listener has arrived. But to make it useful in business, it must know <em>your</em> data&#8212;the internal, governed, securely indexed core of your organization. That&#8217;s where the next layer takes over: the part of the architecture that remembers everything without violating anything. Time to meet the brain&#8212;Azure AI Search, where retrieval finally joins generation.</p><h2>Section 3: The Brain &#8212; Azure AI Search and the RAG Pattern</h2><p>Let&#8217;s be clear: GPT&#8209;4o may sound articulate, but left alone, it&#8217;s an eloquent goldfish. No memory, no context, endless confidence. To make it useful, you have to tether that generative brilliance to <strong>real data</strong>&#8212;your actual M365 content, stored, governed, and indexed. That tether is the Retrieval&#8209;Augmented Generation pattern, mercifully abbreviated to RAG. It&#8217;s the technique that converts an AI from a talkative guesser into a knowledgeable colleague.</p><p>Here&#8217;s the structure. In RAG, every answer begins with retrieval, not imagination. The model doesn&#8217;t just &#8220;think harder&#8221;; it <em>looks up evidence</em>. Imagine a librarian who drafts the essay only after fetching the correct shelf of books. Azure AI Search is that librarian&#8212;fast, literal, and meticulous. When you integrate it with GPT&#8209;4o, you&#8217;re essentially plugging a language model into your corporate brain.</p><p>Azure AI Search works like this: your files&#8212;Word docs, PDFs, SharePoint items&#8212;live peacefully in Azure BLOB Storage. The search service ingests that material, enriches it with AI, and builds multiple kinds of indexes, including <em>semantic</em> and <em>vector</em> indexes. Vectors are mathematical fingerprints of meaning. Each sentence, each paragraph, becomes a coordinate in high&#8209;dimensional space. When you ask a question, the system doesn&#8217;t do keyword matching; it runs a similarity search through that semantic galaxy, finding entries whose &#8220;meaning vectors&#8221; sit closest to your query.</p><p>Think of it like DNA matching&#8212;but for language. A policy document about &#8220;employee perks&#8221; and another about &#8220;compensation benefits&#8221; might use totally different words, yet in vector space they share 99 percent genetic overlap. That&#8217;s why RAG&#8209;based systems can interpret natural speech like &#8220;Does our company still cover scuba lessons?&#8221; and fetch the relevant HR benefits clause without you ever mentioning the phrase &#8220;perk allowance.&#8221;</p><p>In plain English&#8212;your data learns to recognize itself faster than your compliance officer finds disclaimers. GPT&#8209;4o then takes those relevant snippets&#8212;usually a few sentences from the top matches&#8212;and fuses them into the generative response. The outcome feels human but remains factual, grounded in what Azure AI Search retrieved. No hallucinations about imaginary insurance plans, no invented policy names, no &#8220;alternative facts.&#8221;</p><p>Security people love this pattern because grounding preserves control boundaries. The AI never has unsupervised access to the entire repository; it only sees the materials passed through retrieval. Even better, Azure AI Search supports <strong>confidential computing</strong>, meaning those indexes can be processed inside hardware&#8209;based secure enclaves. Voice transcripts or HR docs aren&#8217;t just &#8220;in the cloud&#8221;&#8212;they&#8217;re inside encrypted virtual machines that even Microsoft engineers can&#8217;t peek into. That&#8217;s how you discuss sensitive benefits by voice without violating your own governance rules.</p><p>Now, to make RAG sustainable in enterprise workflows, you insert a <strong>proxy</strong>&#8212;a modest but decisive layer between GPT&#8209;4o and Azure AI Search. This middle tier manages tool calls, performs the retrieval, sanitizes outputs, and logs activity for compliance. GPT&#8209;4o never connects directly to your search index; it requests a &#8220;search tool,&#8221; which the proxy executes on its behalf. You gain auditing, throttling, and policy enforcement in one move. It&#8217;s the architectural version of talking through legal counsel. Safe, accountable, and occasionally necessary.</p><p>This proxy also allows multi&#8209;tenant setups. Different departments&#8212;finance, HR, engineering&#8212;can share the same AI core while maintaining isolated data scopes. Separation of concerns equals separation of risk. If marketing shouts &#8220;What&#8217;s our expense limit for conferences?&#8221; the AI brain only rummages through marketing&#8217;s index, not finance&#8217;s ledger. The retrieval rules define not only what&#8217;s relevant but also what&#8217;s <em>permitted</em>.</p><p>Technically, that&#8217;s the genius of Azure AI Search&#8212;it&#8217;s not just a search engine; it&#8217;s a controlled memory system with role&#8209;based access baked in. You can enrich data during ingestion, attach metadata tags like &#8220;confidential,&#8221; and filter queries accordingly. The RAG layer respects those boundaries automatically. Generative AI remains charmingly oblivious to your internal hierarchies; Azure enforces them behind the curtain.</p><p>This organized amnesia serves governance well. If a department deletes a document or revokes access, the next indexing run removes it from retrieval candidates. The model literally forgets what it&#8217;s no longer authorized to know. Compliance officers dream of systems that forget on command, and RAG delivers that elegantly.</p><p>The performance side is just as elegant. Traditional keyword search crawls indexes sequentially; Azure AI Search employs vector similarity, semantic ranking, and hybrid scoring to retrieve the most contextually appropriate content first. GPT&#8209;4o is then handed a compact, high&#8209;fidelity context window&#8212;no noise, no irrelevant fluff&#8212;making responses faster and cheaper. You&#8217;re essentially feeding it curated intelligence instead of letting it rummage through raw data.</p><p>And for those who enjoy buzzwords, yes&#8212;this is &#8220;enterprise grounding.&#8221; But what matters is reliability. When Copilot answers a policy question, it cites the exact source file and keeps the phrasing legally accurate. Unlike consumer&#8209;grade assistants that invent quotes, this brain references your actual compliance text&#8212;down to document ID and section. In other words, your AI finally behaves like an employee who reads the manual before answering.</p><p>Combine that dependable retrieval with GPT&#8209;4o&#8217;s conversational flow, and you get something uncanny: a voice interface that&#8217;s both chatty and certified. It talks like a human but thinks like SharePoint with an attitude problem.</p><p>Now we have the architecture&#8217;s nervous system&#8212;the brain that remembers, cross&#8209;checks, and protects. But a brain without an output device is merely a server farm daydreaming in silence. Information retrieval is impressive, sure, but someone has to speak it aloud&#8212;and do so within corporate policy. Fortunately, Microsoft already supplied the vocal cords. Next comes the mouth: integrating this carefully trained mind with M365&#8217;s voice layer so it can speak responsibly, even when you whisper the difficult questions.</p><h2>Section 4: The Mouth &#8212; M365 Integration for Secure Voice Interaction</h2><p>Now that the architecture has a functioning brain, it needs a mouth&#8212;an output mechanism that speaks policy-compliant wisdom without spilling confidential secrets. Enter Microsoft 365 integration, where the theoretical meets the practical, and GPT&#8209;4o&#8217;s linguistic virtuosity finally learns to say real things to real users, securely.</p><p>Here&#8217;s the chain of custody for your voice. You speak into a Copilot Studio agent or a custom Power App embedded in Teams. Your words convert into sound signals&#8212;beautifully untyped, mercifully fast&#8212;and those streams are routed through a secure proxy layer. The proxy connects to Azure AI Search for retrieval and grounding, then funnels the curated knowledge back through GPT&#8209;4o Realtime for immediate voiced response. You ask, &#8220;What&#8217;s our vacation carryover rule?&#8221; and within a breath, Copilot politely answers aloud, citing the HR policy stored deep in SharePoint. The full loop&#8212;from mouth to mind and back&#8212;finishes before your coffee cools.</p><p>What&#8217;s elegant here is the division of labor. The <strong>Power Platform</strong>&#8212;Copilot Studio, Power Apps, Power Automate&#8212;handles the user experience. Think microphones, buttons, Teams interfaces, adaptive cards. Azure handles cognition: retrieval, reasoning, generation. In other words, Microsoft separated presentation from intelligence. Your Power App never carries proprietary model keys or search credentials. It just speaks to the proxy, the same way you speak to Copilot. That&#8217;s why this architecture scales without scaring the security team.</p><p>Speaking of security, this is where governance flexes its muscles. Every syllable of that interaction&#8212;your voice, its transcription, the AI&#8217;s response&#8212;is covered by <strong>Data Loss Prevention policies</strong>, <strong>role&#8209;based access controls</strong>, and <strong>confidential computing</strong> protections. Voice data isn&#8217;t flitting around like stray packets; it&#8217;s encrypted in transit, processed inside trusted execution environments, and discarded per policy. The pipeline doesn&#8217;t merely answer securely&#8212;it <em>remains</em> secure while answering.</p><p>When Microsoft retired <strong>speaker recognition</strong> in 2025, many panicked about identity verification. &#8220;How will the system know who&#8217;s speaking?&#8221; Easily: by <strong>context</strong>, not by biometrics. Copilot integrates with your Microsoft Entra identity, Teams presence, and session metadata. The system knows who you are because you&#8217;re authenticated into the workspace&#8212;not because it memorized your vocal cords. That means no personal voice enrollment, no biometric liability, and no new privacy paperwork. The authentication wraps around the session itself, so the voice experience remains as compliant as the rest of M365.</p><p>Consider what happens technically: the voice packet you generate enters a confidential virtual machine&#8212;the secure sandbox where GPT&#8209;4o performs its reasoning. There, the model accesses only intermediate representations of your data, not raw files. The retrieval logic runs server&#8209;side inside Azure&#8217;s confidential computing framework. Even Microsoft engineers can&#8217;t peek inside those enclaves. So yes, even your whispered HR complaint about that new mandatory team&#8209;building exercise is processed under full compliance certification. Romantic, in a bureaucratic sort of way.</p><p>For enterprises obsessed with regulation&#8212;and who isn&#8217;t now&#8212;this matters. GDPR, HIPAA, ISO 27001, SOC&#8209;2; they remain intact. Because every part of that voice loop respects boundaries already defined in M365 data governance. Speech becomes just another modality of query, subject to the same auditing and eDiscovery rules as email or chat. In fact, transcripts can be automatically logged in Microsoft Purview for compliance review. The future of internal accountability? It talks back.</p><p>Now, about policy control. Each voice interaction adheres to your organization&#8217;s <strong>DLP filters</strong> and <strong>information barriers</strong>. The model knows not to read classified content aloud to unauthorized listeners. It won&#8217;t summarize the board minutes for an intern. The compliance layer acts like an invisible moderator, quietly ensuring conversation stays appropriate. Every utterance is context&#8209;aware, permission&#8209;checked, and policy&#8209;filtered before synthesis.</p><p>Underneath, the architecture relies on the <strong>proxy layer</strong> again. Remember it from the RAG setup? It&#8217;s still the diplomatic translator between your conversational AI and everything it&#8217;s not supposed to see. That same proxy sanitizes response metadata, logs timing metrics, even tags outputs for audit trails. It ensures your friendly chatbot doesn&#8217;t accidentally become a data exfiltration service.</p><p>Practically, this design means you can deploy voice&#8209;enabled agents across departments without rewriting compliance rules. HR, Finance, Legal&#8212;all maintain their data partitions, yet share one listening Copilot. Each department&#8217;s knowledge base sits behind its own retrieval endpoints. Users hear seamless, unified answers, but under the hood, every sentence originates from a policy&#8209;scoped domain.</p><p>And because all front&#8209;end logic resides in Power Platform, there&#8217;s no need for heavy coding. Makers can build Teams extensions, mobile apps, or agent experiences that behave identically. The Realtime API acts as the interpreter, the search index acts as memory, and governance acts as conscience. The trio forms the digital equivalent of thinking before speaking&#8212;finally a machine that does it automatically.</p><p>So yes, your AI can now hear, think, and speak responsibly&#8212;all wrapped in existing enterprise compliance. Voice has become more than input; it&#8217;s a <strong>policy&#8209;compliant user interface</strong>. Users don&#8217;t just interact&#8212;they converse securely. The machine doesn&#8217;t just reply&#8212;it behaves.</p><p>Now that the system can talk back like a well&#8209;briefed colleague, the next question writes itself: how do you actually deploy this conversational knowledge layer across your environment without tripping over API limits or governance gates? Because a talking brain is nice. A deployed one is transformative.</p><h2>Section 5: Deploying the Voice&#8209;Driven Knowledge Layer</h2><p>Time to leave theory and start deployment. You&#8217;ve admired the architecture long enough; now assemble it. Fortunately, the process doesn&#8217;t demand secret incantations or lines of Python no mortal can maintain. It&#8217;s straightforward engineering elegance: four logical steps, zero hand&#8209;waving.</p><p>Step one: <strong>Prepare your data in BLOB Storage.</strong> Azure doesn&#8217;t need your internal files sprinkled across a thousand SharePoint libraries. Consolidate the source corpus&#8212;policy documents, procedure manuals, FAQs, technical standards&#8212;into structured containers. That&#8217;s your raw fuel. Tag files cleanly: department, sensitivity, version. When ingestion starts, you want search to know what it&#8217;s digesting, not choke on duplicates from 2018.</p><p>Step two: <strong>Create your indexed search.</strong> In Azure AI Search, configure a hybrid index that mixes vector and semantic ranking. Vector search grants contextual intelligence; semantic ranking ensures precision. Indexing isn&#8217;t a one&#8209;and&#8209;done exercise. Configure automatic refresh schedules so new HR guidelines appear before someone files a ticket asking where their dental plan went. Each pipeline run re&#8209;embeds the text, re&#8209;computes vectors, and updates the semantic layers&#8212;your data literally keeps itself fluent in context.</p><p>Step three: <strong>Build the middle&#8209;tier proxy.</strong> Too many architects skip this and then email me asking why their Copilot leaks telemetry like a rookie intern. The proxy mediates all Realtime API calls. It listens to voice input from the Power Platform, triggers retrieval functions in Azure AI Search, merges grounding data, and relays responses back to GPT&#8209;4o. This is also where you insert governance logic: rate limits, logging, user impersonation rules, and compliance tagging. Think of it as the diplomatic attach&#233; between Realtime intelligence and enterprise paranoia.</p><p>Step four: <strong>Connect the front end.</strong> In Copilot Studio or Power Apps, create the voice UI. Assign it input and output nodes bound to your proxy endpoints. You don&#8217;t stream raw audio into GPT directly; you stream through controlled channels. Configure the Realtime API tokens in Azure, not in the app, so no maker accidentally hard&#8209;codes your secret keys into a demo. The voice flows under policy supervision. When done correctly, your Copilot speaks through an encrypted intercom, not an open mic.</p><p>Now, about constraints. Power Platform may tempt you to handle the whole flow inside one low&#8209;code environment. Don&#8217;t. The platform enforces API request limits&#8212;forty thousand per user per day, two hundred fifty thousand per flow. A chatty voice assistant will burn through that quota before lunch. Heavy lifting belongs in Azure. The Power App orchestrates; Azure executes. Let the cloud absorb the audio workload so your flows remain decisive instead of throttled.</p><p>A quick reality check for makers: building this layer won&#8217;t look like writing a bot&#8212;it&#8217;ll feel like provisioning infrastructure. You&#8217;re wiring ears to intelligence to compliance, not gluing dialogs together. Business users still hear a simple &#8220;Copilot that talks,&#8221; but under the hood it&#8217;s a distributed system balancing cognition, security, and bandwidth.</p><p>And since maintenance always determines success after applause fades, plan <em>governed automation</em> from day one. Azure AI Search supports event&#8209;driven re&#8209;indexing; hook it to your document libraries so updates trigger automatically. Add Purview scanning rules to confirm nothing confidential sneaks into retrieval. Combine that with audit trails in the proxy layer, and you&#8217;ll know not only what the AI said, but <em>why</em> it said it.</p><p>Real&#8209;world examples clarify the payoff. HR teams query handbooks by voice: &#8220;How many vacation days carry over this year?&#8221; IT staff troubleshoot policies mid&#8209;call: &#8220;What&#8217;s the standard laptop image?&#8221; Legal reviews compliance statements orally, retrieving source citations instantly. The latency is low enough to feel conversational, yet the pipeline remains rule&#8209;bound. Every exchange leaves a traceable log&#8212;samplers of knowledge, not breadcrumbs of liability.</p><p>From a productivity lens, this system closes the cognition gap between thought and action. Typing created delay; speech removes it. The RAG architecture ensures factual grounding; confidential computing enforces safety; the Realtime API brings speed. Collectively, they form what amounts to an <strong>enterprise oral tradition</strong>&#8212;the company can literally <em>speak its knowledge</em> back to employees.</p><p>And that&#8217;s the transformation: not a prettier interface, but the birth of <strong>operational conversation</strong>&#8212;machines participating legally, securely, instantly. The modern professional&#8217;s tools have evolved from click, to type, to talk. Next time you see someone pause mid&#8209;meeting to hammer out a Copilot query, you&#8217;re watching latency disguised as habit. Politely suggest evolution.</p><p>So yes, the deployment checklist fits on one whiteboard: prepare, index, proxy, connect, govern, maintain. Behind each verb lies an Azure service; together, they give Copilot lungs, memory, and manners. You&#8217;ve now built a knowledge layer that listens, speaks, and keeps secrets better than your average conference call attendee. The only remaining step is behavioural&#8212;getting humans to stop typing like it&#8217;s 2003 and start conversing like it&#8217;s the future they already licensed.</p><h2>Conclusion: The Simple Human Upgrade</h2><p>Voice is not a gadget; it&#8217;s the missing sense your AI finally developed. The fastest, most natural, and&#8212;thanks to Azure&#8217;s governance&#8212;the most secure way to interact with enterprise knowledge. With GPT&#8209;4o streaming intellect, Azure AI Search grounding truth, and M365 governing behavior, you&#8217;re no longer typing at Copilot&#8212;you&#8217;re collaborating with it in real time.</p><p>Typing to Copilot is like sending smoke signals to Outlook&#8212;technically feasible, historically interesting, utterly pointless. The smarter move is auditory. Build the layer, wire the proxy, and speak your workflows into motion.</p><p>If this explanation saved you ten keystrokes&#8212;or ten minutes&#8212;repay the efficiency debt: subscribe. Enable notifications so the next architectural deep dive arrives automatically, like a scheduled backup for your brain. Stop typing. Start talking.</p>]]></content:encoded></item><item><title><![CDATA[Stop Your Cloud Migration: You Are Not AI Ready]]></title><description><![CDATA[Introduction: The Cloud Migration Warning]]></description><link>https://newsletter.m365.show/p/stop-your-cloud-migration-you-are</link><guid isPermaLink="false">https://newsletter.m365.show/p/stop-your-cloud-migration-you-are</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Sun, 16 Nov 2025 05:07:38 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176689395/77aafc5f2179748ff28689cdf96ce6f4.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Introduction: The Cloud Migration Warning</h2><p>Stop. Put down your migration roadmap and close the Azure portal&#8212;because you&#8217;re about to make a mistake that will haunt your AI plans for the next decade. You&#8217;re migrating to the cloud as if it&#8217;s 2015, but expecting it to deliver 2025&#8217;s AI miracles. That is not strategy. That&#8217;s nostalgia dressed as progress.</p><p>Here&#8217;s the uncomfortable truth: most organizations brag about being &#8220;cloud first,&#8221; but few are even <em>AI capable</em>. They moved their servers, their databases, and their applications to Azure, AWS, or Google Cloud&#8212;and called that transformation. The problem? AI doesn&#8217;t care that your virtual machines are in someone else&#8217;s data center. It cares about your data structure, your security posture, and your governance model.</p><p>Think of it like moving boxes from your old house to a shiny, modern condo. If you dump everything&#8212;broken furniture, expired canned beans, old tax receipts&#8212;into the new space, you didn&#8217;t transform; you just changed the location of your mess. That&#8217;s what most cloud migrations look like right now: operationally expensive, beautifully marketed piles of technical debt.</p><p>And the cruel irony? Those same migrations were sold as &#8220;future-proof.&#8221; Spoiler: the future proof didn&#8217;t include AI. Everything from your access controls to your compliance framework was built for static workloads and predictable data. AI needs fluid, governed, interconnected, and traceable data pipelines.</p><p>So, if you&#8217;re mid-migration or just celebrated your &#8220;lift-and-shift&#8221; anniversary&#8212;congratulations, you now own an architecture that&#8217;s cloud-ready and AI-hostile. But you can fix it, if you understand where the trap begins.</p><h2>The Cloud Migration Trap: Why Lift-and-Shift Fails AI</h2><p>The trap is psychological and architectural at once. You believe that &#8220;cloud equals modern.&#8221; It doesn&#8217;t. Moving workloads without modernizing your data, governance, and security means you&#8217;ve rebuilt the Titanic&#8212;beautifully stable until it hits an AI-shaped iceberg.</p><p>Lift-and-shift was designed for one purpose: speed. It minimized disruption by moving virtual machines to virtualized environments. That&#8217;s fine when your priority is shutting down datacenters to save on cooling bills. But AI isn&#8217;t interested in your HVAC efficiency; it depends on clean, structured, and accessible data governed by clear policies.</p><p>When you lift and shift, you preserve every bad habit your infrastructure ever had. Old directory structures, fragmented identity management, inconsistent tagging, legacy dependencies&#8212;all migrate with you. Then you add AI and expect it to reason across data silos that your own admins can barely navigate. The model can&#8217;t see the connections because your systems never documented them.</p><p>Security? Worse. Traditional migrations often replicate permissions and policies as-is. It feels safe because nothing breaks on day one. But those inherited permissions become a nightmare under AI workloads. Copilot and GPT-based systems access data contextually, not transactionally. So, one badly scoped Azure role or shared key can expose confidential training material faster than any human breach. You wanted scalability; what you actually deployed was massive-scale risk.</p><p>And governance&#8212;let&#8217;s just say it didn&#8217;t migrate with you. Lift-and-shift assumes human oversight remains constant, but AI multiplies the rate of data creation, consumption, and recombination. Your old compliance scripts can&#8217;t keep up. They weren&#8217;t written to trace how a language model inferred customer patterns or which pipeline fed it sensitive tokens. Without unified governance, every AI output is potentially a compliance incident.</p><p>Now enter cost. Ironically, lift-and-shift is advertised as cheap. But when AI projects arrive, you realize your cloud bills explode. Why? Because every unoptimized workload and fragmented data store adds friction to AI orchestration. Instead of a unified data fabric, you&#8217;re paying for a scattered archive&#8212;and you can&#8217;t scale intelligence on clutter.</p><p>Microsoft&#8217;s own AI readiness assessments show that AI ROI depends on modern governance, consistent data integration, and security telemetry&#8212;not just compute horsepower. Which means your AI readiness isn&#8217;t decided by your GPU quota; it&#8217;s decided by whether your migration aligned with Foundry principles: unified resources, shared responsibility, and managed identity by design.</p><p>So yes, lift-and-shift gets you to the cloud fast. But it also locks you out of the AI economy unless you rebuild the layers beneath&#8212;your data, your permissions, your compliance frameworks. Without that foundation, &#8220;AI readiness&#8221; remains a PowerPoint fantasy.</p><p>You migrated your servers; now you need to migrate your mindset. Otherwise, your next-gen cloud might as well be a digital warehouse: full of stuff, beautifully maintained, and utterly unusable for the future you claim to be preparing for.</p><h2>Pillar 1: Data Readiness &#8211; The Foundation of AI</h2><p>Let&#8217;s start where every AI initiative pretends it already started: with data. Because the hard truth is that your data isn&#8217;t ready for AI, and deep down you already know it.</p><p>Organizations keep talking about &#8220;AI transformation&#8221; as if it&#8217;s something they can enable with a new license key. Yet behind the scenes, most data still exists in silos guarded by compliance scripts written before anyone knew what a large language model was. AI projects don&#8217;t fail because models are bad&#8212;they fail because the data feeding them is inconsistent, inaccessible, and undocumented.</p><p>Think of your organization&#8217;s data like plumbing. For years, you&#8217;ve been patching new pipes onto old ones&#8212;marketing CRM here, HR spreadsheets there, a slightly haunted SharePoint site that hasn&#8217;t been cleaned since 2014. It technically works. Water flows. But AI doesn&#8217;t want &#8220;technically works.&#8221; It demands pressure-tested pipelines with filters, valves, and consistent flow. The moment you connect Copilot, those leaks become floods, and those rusted pipes start contaminating every prediction.</p><p>So, what does &#8220;data readiness&#8221; actually mean? Three things: structure, lineage, and governance. Structure means data that&#8217;s normalized and retrievable by systems that aren&#8217;t ancient. Lineage means you know exactly where that data came from, how it was transformed, and what policies apply to it. Governance means there&#8217;s a consistent way to authorize, audit, and restrict usage&#8212;automatically. Anything short of that, and your AI outputs will be statistical hallucinations disguised as insight.</p><p>Azure Fabric exists for that reason&#8212;it&#8217;s Microsoft&#8217;s attempt to replace a tangle of disparate analytics tools with a unified data substrate. But here&#8217;s the catch: Fabric can&#8217;t fix logic it doesn&#8217;t understand. If your migration merely copied old warehouses and dumped them into Data Lake Gen2, then Fabric is simply cataloguing chaos. The act of migration did nothing to align your schema, duplicate reduction, or metadata tagging.</p><p>You can&#8217;t say you&#8217;re building AI capability while tolerating inconsistent tagging across resource groups or allowing shadow data stores to exist &#8220;temporarily&#8221; for three fiscal years. AI readiness begins with a ruthless data inventory&#8212;identifying redundant assets, consolidating versions, and applying governance templates that map to your compliance standards.</p><p>Look at the pattern from Microsoft&#8217;s own AI readiness research: companies that succeed with AI define data classification policies <em>before</em> training models. Those that fail treat classification as paperwork after deployment. It&#8217;s like running an experiment without recording which chemicals you used&#8212;you might get fireworks, but you&#8217;ll never reproduce them safely.</p><p>Here&#8217;s where it gets darker. Inconsistent data governance is not just inefficient; it&#8217;s legally volatile. LLMs remember patterns&#8212;if confidential client information accidentally enters a training corpus, you have a compliance breach with a neural memory. There&#8217;s no &#8220;undo&#8221; for that. Azure&#8217;s multi-layered security stack, from Defender for Cloud to Key Vault, exists to enforce confidentiality boundaries, but only if you actually use it. Copying your old security groups into the cloud without revalidating access chains means you&#8217;re inviting the model to peek into places no human auditor could justify.</p><p>And the final insult? Storage is cheap, but ignorance isn&#8217;t. Every unmanaged dataset increases the attack surface. Every unclassified file adds uncertainty to your AI compliance reports. You can deploy as many CoPilots as you like&#8212;if each department&#8217;s data policy contradicts the next, your AI is effectively bilingual in nonsense.</p><p>The simplest test: if you can&#8217;t trace the origin, transformation, and access control of your top ten datasets in under an hour, you are not AI ready, no matter how glossy your Azure dashboard looks.</p><p>True data readiness means adopting continuous governance&#8212;rules that travel with the data, enforced through Fabric and Purview integration. Every time a user moves or modifies data, those policies must follow automatically. That&#8217;s not a luxury; it&#8217;s the baseline for AI ethics, privacy, and reproducibility.</p><p>In the AI era, data isn&#8217;t just an asset&#8212;it&#8217;s the bloodstream of the entire operation. Migration moved the body; now you need to clean the blood. Because if your data has impurities, your AI decisions have consequences&#8212;at scale, instantly, and irreversibly.</p><h2>Pillar 2: Infrastructure and MLOps Maturity</h2><p>Now, even if your data were pristine, you&#8217;d still fail without the muscle to process it intelligently. That&#8217;s where infrastructure and MLOps come in&#8212;the skeleton and nervous system of AI readiness.</p><p>Lifting workloads to virtual machines is the toddler phase of cloud evolution. Mature organizations don&#8217;t migrate applications; they migrate control. Specifically, they transition from static environments to orchestrated, policy-driven platforms that understand context, dependencies, and performance in real time. Azure AI Foundry embodies that shift&#8212;a unified environment where compute, data, and governance live together instead of playing long-distance relationship over APIs. But Foundry doesn&#8217;t forgive poor infrastructure hygiene.</p><p>Ask yourself: how many of your AI experiments still depend on manual deployment scripts, custom Docker files, or human-triggered approvals? That&#8217;s charming until you want scalability. Modern MLOps maturity means reproducible pipelines that define metrics, datasets, and version control as code. No more &#8220;Oops, we lost the model&#8221; moments because Jenkins ate the artifact. Foundry and Azure Machine Learning now support full lifecycle tracking&#8212;if you use them properly.</p><p>The key word being &#8220;properly.&#8221; Most teams treat MLOps as an add-on, not a cultural discipline. They automate training runs but still rely on manual compliance checks. They track accuracy but ignore model lineage. AI readiness lives or dies on traceability. You need to know which dataset trained which model under which conditions, and you need that proof automatically generated, not via an intern&#8217;s spreadsheet.</p><p>Infrastructure maturity also means understanding cost versus capability. Everyone loves GPUs&#8212;until the bill arrives. The trick isn&#8217;t throwing more compute at AI; it&#8217;s coordinating intelligent resource scaling with security and governance baked in. Azure Arc and Defender for Cloud allow exactly that&#8212;hybrid observability with centralized control. But immature migrations treat Arc like a side quest, not a control plane.</p><p>Let&#8217;s differentiate: infrastructure is hardware allocation; MLOps is behavioral governance of that hardware. One without the other is like giving a toddler car keys. You may have the power, but you lack workflow discipline. Mature ecosystems treat every deployment like a compliance artifact&#8212;auditable, reversible, explainable.</p><p>Remember the Foundry prerequisites: regional alignment, unified identity, and endpoint authentication. If your team can&#8217;t confidently state which region each dataset and model resides in, congratulations&#8212;you&#8217;ve built an AI compliance time bomb. And if you&#8217;re still using connection strings older than your interns, you&#8217;ve already fallen behind the May 2025 migration cutoff.</p><p>On-premise nostalgia is the enemy here. The future runs on infrastructure that treats compute as ephemeral&#8212;containers spun up, used, and terminated automatically with policy enforcement. Human-configured machines are liabilities; coded deployments are guarantees. That&#8217;s the delta between experimental AI and production AI.</p><p>And this is where infrastructure meets psychology again: you can&#8217;t secure what you don&#8217;t orchestrate. Governance frameworks like NIST&#8217;s AI RMF and ISO 42001 assume your infrastructure tracks model provenance and risk classification by default. If your system architecture can&#8217;t produce that metadata on demand, no audit will save you.</p><p>The irony? Cloud was sold as freedom. True AI readiness turns it into accountability. A mature MLOps setup doesn&#8217;t just train faster&#8212;it testifies, logs, and justifies every result. It becomes your alibi when regulators or executives ask, &#8220;Where did this decision come from?&#8221;</p><p>So yes, infrastructure and MLOps are not glamorous. They&#8217;re the scaffolding you build before you hang the AI art on the wall. But unlike art, this needs precision. Without orchestrated infrastructure, your AI strategy remains theoretical. With it, every model, every experiment, and every pipeline becomes traceable, secure, and scalable.</p><p>That&#8217;s what makes you not just cloud migrated&#8212;but genuinely, provably AI ready.</p><h2>Pillar 3: The Talent and Governance Gap</h2><p>Now let&#8217;s discuss the most dangerous illusion of modernization&#8212;the belief that tooling compensates for competence. It doesn&#8217;t. You can subscribe to every Azure service known to humankind and still fail because your people and governance processes are calibrated for a pre&#8209;AI century.</p><p>Here&#8217;s the paradox: everyone wants AI, but no one wants to retrain staff to manage it responsibly. Migration programs often focus on infrastructure diagrams, not organizational diagrams. Yet it&#8217;s the humans, not the hardware, who enforce or violate governance boundaries. If your cloud team doesn&#8217;t understand data classification, identity inheritance, or model&#8209;level security, you&#8217;ve simply automated confusion at scale.</p><p>Think of governance as choreography. Before AI, you could improvise&#8212;a developer could spin up a database, extract some tables, and no one noticed. In an AI environment, every undocumented decision becomes a policy violation in waiting. Who trains the model? Who validates the dataset lineage? Who approves the prompt templates feeding Copilot? If the answer to all three is &#8220;the same guy who wrote the PowerShell script,&#8221; then congratulations&#8212;you&#8217;ve institutionalized risk.</p><p>The talent gap isn&#8217;t just missing data scientists; it&#8217;s missing <em>governance technologists</em>&#8212;people who understand how AI interacts with policy frameworks like ISO 42001 or NIST&#8217;s AI RMF. Right now, most enterprises treat those as PowerPoint disclaimers, not daily practice. The result? Compliance theater. They write &#8220;Responsible AI&#8221; guidelines, then hand model tuning to interns because &#8220;the Azure portal makes it easy.&#8221; Spoiler: the portal doesn&#8217;t make ethics easy; it just masks how complex it truly is.</p><p>Microsoft&#8217;s research into AI readiness lists &#8220;AI governance and security&#8221; as a principal pillar, not because it&#8217;s fashionable, but because it&#8217;s the institutional spine. Yet organizations keep confusing security with secrecy. Locking data down isn&#8217;t governance. Governance is structured transparency: knowing who touched what, when, and whether they had the right to. If your audit trail can&#8217;t prove that without forensic excavation, your governance exists only on paper.</p><p>So how do you close the gap? First, map talent to accountability, not titles. The database admin becomes a data custodian. The network engineer becomes an identity steward. The compliance officer evolves into an AI risk auditor who understands model provenance, not just password policy. Azure Purview, Fabric, and Foundry can surface this metadata automatically&#8212;but someone must interpret it, challenge anomalies, and refine policy templates continuously.</p><p>Second, dissolve the imaginary wall between IT and legal. AI governance isn&#8217;t a compliance afterthought; it&#8217;s an engineering parameter. When data residency laws change, your pipelines must adapt in code, not memos. Organizations that succeed at AI readiness build <strong>governance as code</strong>&#8212;policy enforcement baked into CI/CD pipelines, triggering alerts when a dataset crosses classification boundaries. That demands staff who can read YAML and regulation interchangeably.</p><p>Finally, institute continuous education. Azure evolves monthly; your employees&#8217; understanding evolves yearly, if ever. Treat skilling as part of your security posture. If your architects don&#8217;t know the difference between Azure AI Foundry&#8217;s endpoint authentication and legacy connection strings, they&#8217;re one update away from breaking compliance. Train them, certify them, hold them accountable.</p><p>Because in the AI era, ignorance isn&#8217;t bliss&#8212;it&#8217;s negligence. Governance automation without human intelligence is just bureaucracy accelerated. And that, ironically, is the fastest way to fail &#8220;AI readiness&#8221; while proudly announcing you&#8217;ve completed migration.</p><h2>Case Study: The Cost of Premature Cloud Adoption</h2><p>Let&#8217;s test all of this with a real&#8209;world scenario&#8212;fictionalized, but depressingly common.</p><p>A mid&#8209;size financial services firm&#8212;let&#8217;s call it <em>Fintrax</em>&#8212;undertook a heroic &#8220;Cloud First&#8221; initiative. The CIO promised shareholders lower costs and faster innovation. They migrated hundreds of workloads to Azure within twelve months. Virtual machines replicated perfectly, databases spun up, dashboards glowed green. Success, according to the PowerPoint.</p><p>Then the board requested an AI pilot using Copilot and Azure OpenAI to analyze client interactions. That&#8217;s when success unraveled.</p><p>The first problem: data sprawl. Marketing data lived in Blob Storage, client files in SharePoint, transaction logs in SQL Managed Instance&#8212;all untagged, unclassified, and mutually oblivious. The AI model couldn&#8217;t retrieve consistent records; Fabric integration produced mismatched schemas. Developers manually merged tables, accidentally including personal identifiers. Now they had a compliance breach before the model even trained.</p><p>Next came security chaos. To accelerate migration, Fintrax had replicated on&#8209;premises permissions one&#8209;to&#8209;one. Decades&#8209;old Active Directory groups reappeared in the cloud with global reader access. When the Copilot instance ingested datasets, it followed those same permissions&#8212;meaning junior interns could technically prompt the model for sensitive financial summaries. Defender for Cloud flagged it precisely one week after a regulator did.</p><p>Then the governance vacuum became obvious. No one knew who owned AI risk approvals. Legal demanded documentation for data lineage; IT shrugged, claiming &#8220;it&#8217;s in the portal.&#8221; The portal, in fact, contained 14 disconnected resource groups with overlapping names like <em>AI&#8209;Test2&#8209;Final&#8209;Copy</em>. The phrase &#8220;governance plan&#8221; referred to an Excel sheet saved in OneDrive with color&#8209;coded rows&#8212;half in red, half in regret.</p><p>Each of these failures stemmed from the same root cause: migration treated as a destination instead of a capability. The company assumed that being in Azure automatically meant being secure and compliant. But Azure is a toolbox, not a babysitter. When the billing cycle revealed a 70% cost increase due to duplicated compute and unmanaged storage, the CFO labeled AI an &#8220;unnecessary experiment.&#8221;</p><p>Ironically, the technology worked fine&#8212;the organization didn&#8217;t. With proper data readiness, identity restructuring, and AI governance roles defined in code, Fintrax could have been a showcase for modern transformation. Instead, it became another cautionary slide in someone else&#8217;s keynote.</p><p>The lesson is painfully simple: migrating fast might win headlines, but migrating smart wins longevity. A cloud without governance is just someone else&#8217;s data center full of your liabilities. And until your people, policies, and pipelines operate as one intelligent system, the only thing your &#8220;AI&#8209;ready architecture&#8221; will generate is excuses.</p><h2>The 3&#8209;Step AI&#8209;Ready Cloud Strategy</h2><p>So how do you escape this cycle of fashionable incompetence and actually achieve AI readiness? It&#8217;s not mysterious. You don&#8217;t need a moonshot team of &#8220;AI visionaries.&#8221; You need a disciplined, three&#8209;step architecture strategy: <strong>unify, fortify, and automate</strong>.</p><p><strong>Step one: Unify your data estate.</strong><br>This is the architectural detox your migration skipped. Forget the vendor slogans; your priority is convergence. Every workload, every dataset, every process that feeds intelligence must exist within a governed, observable boundary. In Azure terms, that means integrating Fabric, Purview, and Defender for Cloud into one coherent nervous system&#8212;where classification, lineage, and threat monitoring happen simultaneously.</p><p>Unification starts with ruthless inventory. Identify shadow resources, forgotten storage accounts, orphaned subscriptions. Map them. If you can&#8217;t see them, you can&#8217;t protect them, and if you can&#8217;t protect them, you have no authority to deploy AI over them. Then consolidate data under a consistent schema and enforce metadata tagging through automation&#8212;not human whim. If each resource group uses distinct naming conventions, you&#8217;ve already fractured the genome of your digital organism.</p><p>Once your estate is visible and normalized, link telemetry sources. Connect Microsoft Sentinel, Log Analytics, and Defender signals directly into your Fabric environment. That&#8217;s not over&#8209;engineering; it&#8217;s coherence. AI thrives only when it can correlate behavior across data, identity, and infrastructure. Unification transforms the cloud from a collection of containers into an interpretable environment.</p><p><strong>Step two: Fortify through governance&#8209;as&#8209;code.</strong><br>Security policies written once in a SharePoint document accomplish nothing. Governance must compile. In Azure, this means expressing compliance obligations as deployable templates&#8212;Blueprints, Policies, ARM scripts, Bicep definitions&#8212;that enforce classification and residency automatically. For instance, data labeled &#8220;Confidential&#8209;EU&#8221; should never cross regions. Ever. The system, not an analyst, should prevent that.</p><p>You can implement this today using Azure Policy with aliases mapped to Purview tags, connected to Defender for Cloud posture management. Combine that with identity re&#8209;architecture&#8212;Managed Identities, Conditional Access, Privileged Identity Management&#8212;to ensure AI systems inherit principle&#8209;of&#8209;least&#8209;privilege by design, not by accident.</p><p>Human audits still matter, but humans become reviewers of events, not gatekeepers of execution. That&#8217;s the paradigm shift: codified trust. Your governance documents become executable artifacts tested in pipelines just like software. When regulators arrive, you don&#8217;t share PowerPoint slides&#8212;you run a script that proves compliance in real time.</p><p>Fortification also includes continuous validation. Integrate security assessments into your CI/CD flows so that any configuration drift or untagged resource triggers automated remediation. Think of it as DevSecOps extended to governance: every deployment checks adherence to legal, ethical, and operational constraints before it even reaches production. Only then is your cloud deserving of AI workloads.</p><p><strong>Step three: Automate intelligence feedback.</strong><br>Most organizations implement dashboards and call that &#8220;observability.&#8221; That&#8217;s like fitting smoke alarms and never testing them. AI readiness demands active intelligence loops&#8212;systems that learn about themselves.</p><p>Construct an AI governance model that gathers operational telemetry, classifies anomalies, and adjusts policies dynamically. Azure Monitor and Fabric&#8217;s Real&#8209;Time Analytics can feed this continuous learning loop. If a model suddenly consumes anomalous volumes of sensitive data, the system should alert Defender and automatically throttle access until reviewed.</p><p>Automation is not about convenience; it&#8217;s about survivability. AI operates at machine speed. Human review will always lag unless governance scales equally fast. Automating policy enforcement, cost optimization, and anomaly detection converts your architecture from reactive to adaptive. That, incidentally, is the same operational model underlying Microsoft&#8217;s own AI Foundry.</p><p>Together, unification, fortification, and automation rebuild your cloud into an environment AI trusts. Everything else&#8212;frameworks, roadmaps, skilling programs&#8212;should orbit these three principles. Without them, you&#8217;re simply modernizing your chaos. With them, you start architecting intelligence intentionally rather than accidentally.</p><p>And remember, this isn&#8217;t optional evangelism. The AI Controls Matrix released by the Cloud Security Alliance maps 243 controls; more than half depend on integrated governance, automated monitoring, and unified identity. You can&#8217;t check those boxes after deployment; they are the deployment.</p><p>So, if you want a formula worth engraving on your data&#8209;center wall:<br><strong>Visibility + Verification + Velocity = AI Readiness.</strong><br>Visibility through unification, verification through governance&#8209;as&#8209;code, velocity through automation. Three steps&#8212;performed relentlessly&#8212;and you&#8217;ll transform cloud migration from a logistical exercise into an evolutionary jump.</p><h2>Conclusion: Stop Migrating, Start Architecting</h2><p>Here&#8217;s the bottom line&#8212;migration is a logistics project; architecture is a strategic act.</p><p>If your cloud strategy still reads like a relocation plan, you&#8217;ve already lost a decade. AI will not reward the fastest movers; it will reward the most coherent builders. Cloud migration used to be about reducing friction&#8212;closing datacenters, saving money, consolidating servers. AI readiness is about increasing precision&#8212;tightening control, enriching data lineage, removing ambiguity. Those are opposites.</p><p>So stop migrating for its own sake. Stop treating workload counts as progress reports. The success metric has changed from &#8220;percentage of servers moved&#8221; to &#8220;percentage of decisions we can trace and defend.&#8221;</p><p>Start architecting: build intentional topology, governed unions between data and policy, automation loops that watch themselves. Treat tools like Azure Fabric and AI Foundry not as services but as the regulatory nervous system of your entire enterprise. Start writing your compliance in code, your access controls as logic, your governance as continuous validation pipelines.</p><p>Your next audit should look less like paperwork and more like compilation output: * errors, warnings, all models explainable.*</p><p>And if that sounds like overkill, remember what happens when you don&#8217;t. You end up with cloud sprawl, budget hemorrhage, and AI programs locked in quarantine because nobody can prove what data trained them. Modernization without discipline is merely digital hoarding.</p><p>The irony is that the technology to fix this already sits in your subscription. Azure&#8217;s multi&#8209;layered security, Purview governance, Fabric integration&#8212;each a puzzle piece waiting for an architect, not a tourist. The question is whether you have the will to assemble them before your competitors do.</p><p>So, shut down the migration dashboard. Open your architecture diagram. And start redrafting it like you&#8217;re building the foundation for a planetary AI network&#8212;because, in effect, you are.</p><p>Your systems shouldn&#8217;t just <em>run</em> in the cloud; they should <em>reason</em> with it. Courtesy of actual design, not happy accidents. Stop migrating. Start architecting. That&#8217;s how you become not just &#8220;cloud ready&#8221; but <strong>AI inevitable</strong>.</p>]]></content:encoded></item><item><title><![CDATA[The NVIDIA Blackwell Architecture: Why Your Data Fabric is Too Slow]]></title><description><![CDATA[Opening: The Bottleneck Nobody Talks About]]></description><link>https://newsletter.m365.show/p/the-nvidia-blackwell-architecture</link><guid isPermaLink="false">https://newsletter.m365.show/p/the-nvidia-blackwell-architecture</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Sat, 15 Nov 2025 17:48:36 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176687870/fa0368f27df2c2f02076ca9f324382a5.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Opening: The Bottleneck Nobody Talks About</h2><p>AI training speeds have just exploded. We&#8217;re now running models so large they make last year&#8217;s supercomputers look like pocket calculators. But here&#8217;s the awkward truth: your <strong>data fabric</strong>&#8212;the connective tissue between storage, compute, and analytics&#8212;is crawling along like it&#8217;s stuck in 2013. The result? GPUs idling, inference jobs stalling, and CFOs quietly wondering why &#8220;the AI revolution&#8221; needs another budget cycle.</p><p>Everyone loves the idea of being &#8220;AI&#8209;ready.&#8221; You&#8217;ve heard the buzzwords&#8212;governance, compliance, scalable storage&#8212;but in practice, most organizations have built AI pipelines on infrastructure that simply can&#8217;t move data fast enough. It&#8217;s like fitting a jet engine on a bicycle: technically impressive, practically useless.</p><p>Enter <strong>NVIDIA Blackwell on Azure</strong>&#8212;a platform designed not to make your models smarter but to stop your data infrastructure from strangling them. Blackwell is not incremental; it&#8217;s a physics upgrade. It turns the trickle of legacy interconnects into a flood. Compared to that, traditional data handling looks downright medieval.</p><p>By the end of this explanation, you&#8217;ll see exactly how Blackwell on Azure eliminates the chokepoints throttling your modern AI pipelines&#8212;and why, if your data fabric remains unchanged, it doesn&#8217;t matter how powerful your GPUs are.</p><p>To grasp why Blackwell changes everything, you first need to know what&#8217;s actually been holding you back.</p><h2>Section 1: The Real Problem&#8212;Your Data Fabric Can&#8217;t Keep Up</h2><p>Let&#8217;s start with the term itself. &#8220;Data fabric&#8221; sounds fancy, but it&#8217;s basically your enterprise nervous system. It connects every app, data warehouse, analytics engine, and security policy into one operational organism. Ideally, information should flow through it as effortlessly as neurons firing between your brain&#8217;s hemispheres. In reality? It&#8217;s more like a circulation system powered by clogged pipes, duct-taped APIs, and governance rules added as afterthoughts.</p><p>Traditional cloud fabrics evolved for transactional workloads&#8212;queries, dashboards, compliance checks. They were never built for the firehose tempo of generative AI. Every large model demands petabytes of training data that must be accessed, transformed, cached, and synchronized in microseconds. Yet, most companies are still shuffling that data across internal networks with more latency than a transatlantic Zoom call.</p><p>And here&#8217;s where the fun begins: each extra microsecond compounds. Suppose you have a thousand GPUs, all waiting for their next batch of training tokens. If your interconnect adds even a microsecond per transaction, that single delay replicates across every GPU, every epoch, every gradient update. Suddenly, a training run scheduled for hours takes days, and your cloud bill grows accordingly. Latency is not an annoyance&#8212;it&#8217;s an expense.</p><p>The common excuse? &#8220;We have Azure, we have Fabric, we&#8217;re modern.&#8221; No&#8212;your <strong>software stack</strong> might be modern, but the underlying transport is often prehistoric. Cloud&#8209;native abstractions can&#8217;t outrun bad plumbing. Even the most optimized AI architectures crash into the same brick wall: bandwidth limitations between storage, CPU, and GPU memory spaces. That&#8217;s the silent tax on your innovation.</p><p>Picture a data scientist running a multimodal training job&#8212;language, vision, maybe some reinforcement learning&#8212;all provisioned through a &#8220;state&#8209;of&#8209;the&#8209;art&#8221; setup. The dashboards look slick, the GPUs display 100% utilization for the first few minutes, then&#8230; starvation. Bandwidth inefficiency forces the GPUs to idle as data trickles in through overloaded network channels. The user checks the metrics, blames the model, maybe even re&#8209;tunes hyperparameters. The truth? The bottleneck isn&#8217;t the math; it&#8217;s the movement.</p><p>This is the moment most enterprises realize they&#8217;ve been solving the wrong problem. You can refine your models, optimize your kernel calls, parallelize your epochs&#8212;but if your interconnect can&#8217;t keep up, you&#8217;re effectively feeding a jet engine with a soda straw. You&#8217;ll never achieve theoretical efficiency because you&#8217;re constrained by infrastructure physics, not algorithmic genius.</p><p>And because Azure sits at the center of many of these hybrid ecosystems&#8212;Power BI, Synapse, Fabric, Copilot integrations&#8212;the pain propagates. When your data fabric is slow, analytics drag, dashboards lag, and AI outputs lose relevance before they even reach users. It&#8217;s a cascading latency nightmare disguised as normal operations.</p><p>That&#8217;s the disease. And before Blackwell, there wasn&#8217;t a real cure&#8212;only workarounds: caching layers, prefetching tricks, and endless talks about &#8220;data democratization.&#8221; Those patched over the symptom. Blackwell re&#8209;engineers the bloodstream.</p><p>Now that you understand the problem&#8212;why the fabric itself throttles intelligence&#8212;we can move to the solution: a hardware architecture built precisely to tear down those bottlenecks through sheer bandwidth and topology redesign.</p><p>That, fortunately for you, is where NVIDIA&#8217;s <strong>Grace Blackwell Superchip</strong> enters the story.</p><h2>Section 2: Anatomy of Blackwell&#8212;A Cold, Ruthless Physics Upgrade</h2><p>The <strong>Grace&#8239;Blackwell&#8239;Superchip</strong>, or GB200, isn&#8217;t a simple generational refresh&#8212;it&#8217;s a forced evolution. Two chips in one body: Grace, an ARM&#8209;based CPU, and Blackwell, the GPU, share a unified memory brain so they can stop emailing each other across a bandwidth&#8209;limited void. Before this, CPUs and GPUs behaved like divorced parents&#8212;occasionally exchanging data, complaining about the latency. Now they&#8217;re fused, communicating through 960&#8239;GB/s of coherent NVLink&#8209;C2C bandwidth. Translation: no more redundant copies between CPU and GPU memory, no wasted power hauling the same tensors back and forth.</p><p>Think of the entire module as a <em>neural cortico&#8209;thalamic loop</em>: computation and coordination happening in one continuous conversation. Grace handles logic and orchestration; Blackwell executes acceleration. That cohabitation means training jobs don&#8217;t need to stage data through multiple caches&#8212;they simply exist in a common memory space. The outcome is fewer context switches, lower latency, and relentless throughput.</p><p>Then we scale outward&#8212;from chip to rack. When 72&#8239;of these GPUs occupy a GB200&#8239;NVL72&#8239;rack, they&#8217;re bound by a fifth&#8209;generation <strong>NVLink&#8239;Switch&#8239;Fabric</strong> that pushes a total of <strong>130&#8239;terabytes per second</strong> of all&#8209;to&#8209;all bandwidth. Yes, terabytes per second. Traditional PCIe starts weeping at those numbers. In practice, this fabric turns an entire rack into a single, giant GPU with one shared pool of high&#8209;bandwidth memory&#8212;the digital equivalent of merging 72&#8239;brains into a hive mind. Each GPU knows what every other GPU holds in memory, so cross&#8209;node communication no longer feels like an international shipment; it&#8217;s an intra&#8209;synapse ping.</p><p>If you want an analogy, consider the <strong>NVLink&#8239;Fabric</strong> as the DNA backbone of a species engineered for throughput. Every rack is a chromosome&#8212;data isn&#8217;t transported between cells, it&#8217;s replicated <em>within</em> a consistent genetic code. That&#8217;s why NVIDIA calls it fabric: not because it sounds trendy, but because it actually weaves computation into a single physical organism where memory, bandwidth, and logic coexist.</p><p>But within a data center, racks don&#8217;t live alone; they form clusters. Enter <strong>Quantum&#8209;X800&#8239;InfiniBand</strong>, NVIDIA&#8217;s new inter&#8209;rack communication layer. Each GPU gets a line capable of <strong>800&#8239;gigabits per second</strong>, meaning an entire cluster of thousands of GPUs acts as one distributed organism. Packets travel with adaptive routing and congestion&#8209;aware telemetry&#8212;essentially nerves that sense traffic and reroute signals before collisions occur. At full tilt, Azure can link tens of thousands of these GPUs into a coherent supercomputer scaled beyond any single facility. The neurons may span continents, but the synaptic delay remains microscopic.</p><p>And there&#8217;s the overlooked part&#8212;thermal reality. Running trillions of parameters at petaflop speeds produces catastrophic heat if unmanaged. The GB200&#8239;racks use <strong>liquid cooling</strong> not as a luxury but as a design constraint. Microsoft&#8217;s implementation in Azure ND&#8239;GB200&#8239;v6 VMs uses direct&#8209;to&#8209;chip cold plates and closed&#8209;loop systems with <strong>zero water waste</strong>. It&#8217;s less a server farm and more a precision thermodynamic engine: constant recycling, minimal evaporation, maximum dissipation. Refusing liquid cooling here would be like trying to cool a rocket engine with a desk fan.</p><p>Now, compare this to the outgoing <strong>Hopper</strong> generation. Relative measurements speak clearly: <em>thirty&#8209;five times</em> more inference throughput, <em>two times</em> the compute per watt, and roughly <em>twenty&#8209;five times</em> lower large&#8209;language&#8209;model inference cost. That&#8217;s not marketing fanfare; that&#8217;s pure efficiency physics. You&#8217;re getting democratized gigascale AI not by clever algorithms, but by re&#8209;architecting matter so electrons travel shorter distances.</p><p>For the first time, Microsoft has commercialized this full configuration through the <strong>Azure&#8239;ND&#8239;GB200&#8239;v6</strong> virtual machine series. Each VM node exposes the entire NVLink domain and hooks into Azure&#8217;s high&#8209;performance storage fabric, delivering Blackwell&#8217;s speed directly to enterprises without requiring them to mortgage a data center. It&#8217;s the opposite of infrastructure sprawl&#8212;rack&#8209;scale intelligence available as a cloud&#8209;scale abstraction.</p><p>Essentially, what NVIDIA achieved with Blackwell and what Microsoft operationalized on Azure is a reconciliation between compute and physics. Every previous generation fought bandwidth like friction; this generation eliminated it. GPUs no longer wait. Data no longer hops. Latency is dealt with at the silicon level, not with scripting workarounds.</p><p>But before you hail hardware as salvation, remember: silicon can move at light speed, yet your cloud still runs at bureaucratic speed if the software layer can&#8217;t orchestrate it. Bandwidth doesn&#8217;t schedule itself; optimization is not automatic. That&#8217;s why the partnership matters. Microsoft&#8217;s job isn&#8217;t to supply racks&#8212;it&#8217;s to integrate this orchestration into Azure so that your models, APIs, and analytics pipelines actually exploit the potential.</p><p>Hardware alone doesn&#8217;t win the war; it merely removes the excuses. What truly weaponizes Blackwell&#8217;s physics is Azure&#8217;s ability to scale it coherently, manage costs, and align it with your AI workloads. And that&#8217;s exactly where we go next.</p><h2>Section 3: Azure&#8217;s Integration&#8212;Turning Hardware into Scalable Intelligence</h2><p>Hardware is the muscle. Azure is the nervous system that tells it what to flex, when to rest, and how to avoid setting itself on fire. NVIDIA may have built the most formidable GPU circuits on the planet, but without Microsoft&#8217;s orchestration layer, Blackwell would still be just an expensive heater humming in a data hall. The real miracle isn&#8217;t that Blackwell exists; it&#8217;s that Azure turns it into something you can actually rent, scale, and control.</p><p>At the center of this is the <strong>Azure ND&#8239;GB200&#8239;v6 series</strong>&#8212;Microsoft&#8217;s purpose-built infrastructure to expose every piece of Blackwell&#8217;s bandwidth and memory coherence without making developers fight topology maps. Each ND&#8239;GB200&#8239;v6 instance connects dual Grace&#8239;Blackwell&#8239;Superchips through Azure&#8217;s high-performance network backbone, joining them into enormous <strong>NVLink domains</strong> that can be expanded horizontally to thousands of GPUs. The crucial word there is <em>domain</em>: not a cluster of devices exchanging data, but a logically unified organism whose memory view spans racks.</p><p>This is how Azure transforms hardware into intelligence. The NVLink&#8239;Switch&#8239;Fabric inside each NVL72&#8239;rack gives you that 130&#8239;TB/s internal bandwidth, but Azure stitches those racks together across the <strong>Quantum&#8209;X800&#8239;InfiniBand plane</strong>, allowing the same direct&#8209;memory coherence across datacenter boundaries. In effect, Azure can simulate a single Blackwell superchip scaled out to data&#8209;center scale. The developer doesn&#8217;t need to manage packet routing or memory duplication; Azure abstracts it as one contiguous compute surface. When your model scales from billions to trillions of parameters, you don&#8217;t re&#8209;architect&#8212;you just request more nodes.</p><p>And this is where the Azure software stack quietly flexes. Microsoft re&#8209;engineered its HPC scheduler and virtualization layer so that every ND&#8239;GB200&#8239;v6 instance participates in <strong>domain&#8209;aware scheduling</strong>. That means instead of throwing workloads at random nodes, Azure intelligently maps them based on NVLink and InfiniBand proximity, reducing cross&#8209;fabric latency to near&#8209;local speeds. It&#8217;s not glamorous, but it&#8217;s what prevents your trillion&#8209;parameter model from behaving like a badly partitioned Excel sheet.</p><p>Now add <strong>NVIDIA&#8239;NIM microservices</strong>&#8212;the containerized inference modules optimized for Blackwell. These come pre&#8209;integrated into <strong>Azure&#8239;AI&#8239;Foundry</strong>, Microsoft&#8217;s ecosystem for building and deploying generative models. NIM abstracts CUDA complexity behind REST or gRPC interfaces, letting enterprises deploy tuned inference endpoints without writing a single GPU kernel call. Essentially, it&#8217;s a plug&#8209;and&#8209;play driver for computational insanity. Want to fine&#8209;tune a diffusion model or run multimodal RAG at enterprise scale? You can, because Azure hides the rack&#8209;level plumbing behind a familiar deployment model.</p><p>Of course, performance means nothing if it bankrupts you. That&#8217;s why Azure couples these superchips to its <strong>token&#8209;based pricing</strong> model&#8212;pay per token processed, not per idle GPU&#8209;second wasted. Combined with <strong>reserved instance</strong> and <strong>spot pricing</strong>, organizations finally control how efficiently their models eat cash. A sixty&#8209;percent reduction in training cost isn&#8217;t magic&#8212;it&#8217;s just dynamic provisioning that matches compute precisely to workload demand. You can right&#8209;size clusters, schedule overnight runs at lower rates, and even let the orchestrator scale down automatically the second your epoch ends.</p><p>This optimization extends beyond billing. The ND&#8239;GB200&#8239;v6 series runs on <strong>liquid&#8209;cooled, zero&#8209;water&#8209;waste</strong> infrastructure, which means sustainability is no longer the convenient footnote at the end of a marketing deck. Every watt of thermal energy recycled is another watt available for computation. Microsoft&#8217;s environmental engineers designed these systems as <strong>closed thermodynamic loops</strong>&#8212;GPU heat becomes data&#8209;center airflow energy reuse. So performance guilt dies quietly alongside evaporative cooling.</p><p>From a macro view, Azure has effectively transformed the Blackwell ecosystem into a managed <strong>AI supercomputer service</strong>. You get the 35&#215; inference throughput and 28&#8239;% faster training demonstrated against H100&#8239;nodes, but delivered as a virtualized, API&#8209;accessible pool of intelligence. Enterprises can link Fabric analytics, Synapse queries, or Copilot extensions directly to these GPU clusters without rewriting architectures. Your cloud service calls an endpoint; behind it, tens of thousands of Blackwell GPUs coordinate like synchronized neurons.</p><p>Still, the real brilliance lies in how Azure manages coherence between the <em>hardware</em> and the <em>software</em>. Every data packet travels through telemetry channels that constantly monitor congestion, thermals, and memory utilization. Microsoft&#8217;s scheduler interprets this feedback in real time, balancing loads to maintain consistent performance. In practice, that means your training jobs stay linear instead of collapsing under bandwidth contention. It&#8217;s the invisible optimization most users never notice&#8212;because nothing goes wrong.</p><p>This also marks a fundamental architectural shift. Before, acceleration meant offloading parts of your compute; now, Azure integrates acceleration as a baseline assumption. The platform isn&#8217;t a cluster of GPUs&#8212;it&#8217;s an ecosystem where compute, storage, and orchestration have been physically and logically fused. That&#8217;s why latencies once measured in milliseconds now disappear into microseconds, why data hops vanish, and why models once reserved for hyperscalers are within reach of mid&#8209;tier enterprises.</p><p>To summarize this layer&#8212;without breaking the sarcasm barrier&#8212;Azure&#8217;s Blackwell integration does what every CIO has been promising for ten years: real scalability that doesn&#8217;t punish you for success. Whether you&#8217;re training a trillion&#8209;parameter generative model or running real&#8209;time analytics in Microsoft&#8239;Fabric, the hardware no longer dictates your ambitions; the configuration does.</p><p>And yet, there&#8217;s one uncomfortable truth hiding beneath all this elegance: speed at this level shifts the bottleneck again. Once the hardware and orchestration align, the limitation moves back to your data layer&#8212;the pipelines, governance, and ingestion frameworks feeding those GPUs. All that performance is meaningless if your data can&#8217;t keep up.</p><p>So let&#8217;s address that uncomfortable truth next: feeding the monster without starving it.</p><h2>Section 4: The Data Layer&#8212;Feeding the Monster Without Starving It</h2><p>Now we&#8217;ve arrived at the inevitable consequence of speed: starvation. When computation accelerates by orders of magnitude, the bottleneck simply migrates to the next weakest link&#8212;the data layer. Blackwell can inhale petabytes of training data like oxygen, but if your ingestion pipelines are still dribbling CSV files through a legacy connector, you&#8217;ve essentially built a supercomputer to wait politely.</p><p>The data fabric&#8217;s job, in theory, is to ensure sustained flow. In practice, it behaves like a poorly coordinated supply chain&#8212;latency at one hub starves half the factory. Every file transfer, every schema translation, every governance check injects delay. Multiply that across millions of micro&#8209;operations, and those blazing&#8209;fast GPUs become overqualified spectators. There&#8217;s a tragic irony in that: state&#8209;of&#8209;the&#8209;art hardware throttled by yesterday&#8217;s middleware.</p><p>The truth is that once compute surpasses human-scale delay, milliseconds matter. Real&#8209;time feedback loops&#8212;reinforcement learning, streaming analytics, decision agents&#8212;require sub&#8209;millisecond data coherence. A GPU waiting an extra millisecond per batch across a thousand nodes bleeds efficiency measurable in thousands of dollars per hour. Azure&#8217;s engineers know this, which is why the conversation now pivots from pure compute horsepower to <strong>end&#8209;to&#8209;end data throughput</strong>.</p><p>Enter <strong>Microsoft&#8239;Fabric</strong>, the logical partner in this marriage of speed. Fabric isn&#8217;t a hardware product; it&#8217;s the unification of data engineering, warehousing, governance, and real&#8209;time analytics. It brings pipelines, Power&#8239;BI reports, and event streams into one governance context. But until now, Fabric&#8217;s Achilles&#8217; heel was physical&#8212;its workloads still traveled through general&#8209;purpose compute layers. Blackwell on Azure effectively grafts a high&#8209;speed circulatory system onto that digital body. Data can leave Fabric&#8217;s eventstream layer, hit Blackwell clusters for analysis or model inference, and return as insights&#8212;all within the same low&#8209;latency ecosystem.</p><p>Think of it this way: the old loop looked like train freight&#8212;batch dispatches chugging across networks to compute nodes. The new loop resembles a capillary system, continuously pumping data directly into GPU memory. Governance remains the red blood cells, ensuring compliance and lineage without clogging arteries. When the two are balanced, Fabric and Blackwell form a metabolic symbiosis&#8212;information consumed and transformed as fast as it&#8217;s created.</p><p>Here&#8217;s where things get interesting. <strong>Ingestion</strong> becomes the limiting reagent. Many enterprises will now discover that their connectors, ETL scripts, or data warehouses introduce seconds of drag in a system tuned for microseconds. If ingestion is slow, GPUs idle. If governance is lax, corrupted data propagates instantly. That speed doesn&#8217;t forgive sloppiness; it amplifies it.</p><p>Consider a real&#8209;time analytics scenario: millions of IoT sensors streaming temperature and pressure data into Fabric&#8217;s Real&#8209;Time&#8239;Intelligence hub. Pre&#8209;Blackwell, edge aggregation handled pre&#8209;processing to limit traffic. Now, with NVLink&#8209;fused GPU clusters behind Fabric, you can analyze every signal in situ. The same cluster that trains your model can run inference continuously, adjusting operations as data arrives. That&#8217;s <strong>linear scaling</strong>&#8212;as data doubles, compute keeps up perfectly because the interconnect isn&#8217;t the bottleneck anymore.</p><p>Or take large language model fine&#8209;tuning. With Fabric feeding structured and unstructured corpora directly to ND&#8239;GB200&#8239;v6&#8239;instances, throughput no longer collapses during tokenization or vector indexing. Training updates stream continuously, caching inside unified memory rather than bouncing between disjoint storage tiers. The result: faster convergence, predictable runtime, and drastically lower cloud hours. Blackwell doesn&#8217;t make AI training <em>cheaper</em> per se&#8212;it makes it <em>shorter</em>, and that&#8217;s where savings materialize.</p><p>The enterprise implication is blunt. Small&#8209;to&#8209;mid organizations that once needed hyperscaler budgets can now train or deploy models at near&#8209;linear cost scaling. Efficiency per token becomes the currency of competitiveness. For the first time, Fabric&#8217;s governance and semantic modeling meet hardware robust enough to execute at theoretical speed. If your architecture is optimized, latency ceases to exist as a concept; it&#8217;s just throughput waiting for data to arrive.</p><p>Of course, none of this is hypothetical. Azure and NVIDIA have already demonstrated these gains in live environments&#8212;real clusters, real workloads, real cost reductions. The message is simple: when you remove the brakes, acceleration doesn&#8217;t just happen at the silicon level; it reverberates through your entire data estate.</p><p>And with that, our monster is fed&#8212;efficiently, sustainably, unapologetically fast. What happens when enterprises actually start operating at this cadence? That&#8217;s the final piece: translating raw performance into tangible, measurable payoff.</p><h2>Section 5: Real-World Payoff&#8212;From Trillion-Parameter Scale to Practical Cost Savings</h2><p>Let&#8217;s talk numbers&#8212;because at this point, raw performance deserves quantification. Azure&#8217;s ND&#8239;GB200&#8239;v6 instances running the NVIDIA&#8239;Blackwell stack deliver, on record, thirty-five times more inference throughput than the prior H100 generation, with twenty&#8209;eight percent faster training in industry benchmarks such as MLPerf. The GEMM workload tests show a clean doubling of matrix&#8209;math performance per rack. Those aren&#8217;t rounding errors; that&#8217;s an entire category shift in computational density.</p><p>Translated into business English: what previously required an exascale cluster can now be achieved with a moderately filled data hall. A training job that once cost several million dollars and consumed months of runtime drops into a range measurable by quarter budgets, not fiscal years. At scale, those cost deltas are existential.</p><p>Consider a multinational training a trillion&#8209;parameter language model. On Hopper&#8209;class nodes, you budget long weekends&#8212;maybe a holiday shutdown&#8212;to finish a run. On Blackwell within Azure, you shave off entire weeks. That time delta isn&#8217;t cosmetic; it compresses your product&#8209;to&#8209;market timeline. If your competitor&#8217;s model iteration takes one quarter less to deploy, you&#8217;re late forever.</p><p>And because inference runs dominate operational costs once models hit production, that <em>thirty&#8209;five&#8209;fold</em> throughput bonus cascades directly into the ledger. Each token processed represents compute cycles and electricity&#8212;both of which are now consumed at a fraction of their previous rate. Microsoft&#8217;s renewable&#8209;powered data centers amplify the effect: two times the compute per watt means your sustainability report starts reading like a brag sheet instead of an apology.</p><p>Efficiency also democratizes innovation. Tasks once affordable only to hyperscalers&#8212;foundation model training, simulation of multimodal systems, reinforcement learning with trillions of samples&#8212;enter attainable territory for research institutions or mid&#8209;size enterprises. Blackwell on Azure doesn&#8217;t make AI &#8220;cheap&#8221;; it makes iteration continuous. You can retrain daily rather than quarterly, validate hypotheses in hours, and adapt faster than your compliance paperwork can update.</p><p>Picture a pharmaceutical company running generative drug simulations. Pre&#8209;Blackwell, a full molecular&#8209;binding training cycle might demand hundreds of GPU nodes and weeks of runtime. With NVLink&#8209;fused racks, the same workload compresses to days. Analysts move from post&#8209;mortem analysis to real&#8209;time hypothesis testing. The same infrastructure can pivot instantly to a different compound without re&#8209;architecting, because the bandwidth headroom is functionally limitless.</p><p>Or a retail chain training AI agents for dynamic pricing. Latency reductions in the Azure&#8211;Blackwell pipeline allow those agents to ingest transactional data, retrain strategies, and issue pricing updates continually. The payoff? Reduced dead stock, higher margin responsiveness, and an AI loop that regenerates every market cycle in real time.</p><p>From a cost&#8209;control perspective, Azure&#8217;s <strong>token&#8209;based pricing</strong> model ensures those efficiency gains don&#8217;t evaporate in billing chaos. Usage aligns precisely with data processed. Reserved instances and smart scheduling keep clusters busy only when needed. Enterprises report thirty&#8209;five to forty percent overall infrastructure savings just from right&#8209;sizing and off&#8209;peak scheduling&#8212;but the real win is predictability. You know, in dollars per token, what acceleration costs. That certainty allows CFOs to treat model training as a budgeted manufacturing process rather than a volatile R&amp;D gamble.</p><p>Sustainability sneaks in as a side bonus. The hybrid of Blackwell&#8217;s energy&#8209;efficient silicon and Microsoft&#8217;s zero&#8209;water&#8209;waste cooling yields performance per watt metrics that would&#8217;ve sounded fictional five years ago. Every joule counts twice: once in computation, once in reputation.</p><p>Ultimately, these results prove a larger truth: the cost of intelligence is collapsing. Architectural breakthroughs translate directly into creative throughput. Data scientists no longer spend their nights rationing GPU hours; they spend them exploring. Blackwell compresses the economics of discovery, and Azure institutionalizes it.</p><p>So yes, trillion&#8209;parameter scale sounds glamorous, but the real-world payoff is pragmatic&#8212;shorter cycles, smaller bills, faster insights, and scalable access. You don&#8217;t need to be OpenAI to benefit; you just need a workload and the willingness to deploy on infrastructure built for physics, not nostalgia.</p><p>You now understand where the money goes, where the time returns, and why the Blackwell generation redefines not only what models can do but who can afford to build them. And that brings us to the final reckoning: if the architecture has evolved this far, what happens to those who don&#8217;t?</p><h2>Conclusion: The Inevitable Evolution</h2><p>The world&#8217;s fastest architecture isn&#8217;t waiting for your modernization plan. Azure and NVIDIA have already fused computation, bandwidth, and sustainability into a single disciplined organism&#8212;and it&#8217;s moving forward whether your pipelines keep up or not.</p><p>The key takeaway is brutally simple: <strong>Azure&#8239;+&#8239;Blackwell</strong> means latency is no longer a valid excuse. Data fabrics built like medieval plumbing will choke under modern physics. If your stack can&#8217;t sustain the throughput, neither optimization nor strategy jargon will save it. At this point, your architecture isn&#8217;t the bottleneck&#8212;you are.</p><p>So the challenge stands: refactor your pipelines, align Fabric and governance with this new hardware reality, and stop mistaking abstraction for performance. Because every microsecond you waste on outdated interconnects is capacity someone else is already exploiting.</p><p>If this explanation cut through the hype and clarified what actually matters in the Blackwell era, subscribe for more Azure deep dives engineered for experts, not marketing slides. Next episode: how AI&#8239;Foundry and Fabric orchestration close the loop between data liquidity and model velocity.</p><p>Choose structure over stagnation. Lock in your upgrade path&#8212;subscribe, enable alerts, let the updates deploy automatically, and keep pace with systems that no longer know how to slow down.</p>]]></content:encoded></item><item><title><![CDATA[Stop Using Default Gateway Settings: Fix Your Power Platform Connectivity NOW!]]></title><description><![CDATA[Opening &#8211; Hook + Setup]]></description><link>https://newsletter.m365.show/p/stop-using-default-gateway-settings</link><guid isPermaLink="false">https://newsletter.m365.show/p/stop-using-default-gateway-settings</guid><dc:creator><![CDATA[Mirko Peters - M365 Specialist]]></dc:creator><pubDate>Sat, 15 Nov 2025 05:41:13 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/176686772/386b274ba6b93b0223b682101739214f.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Opening &#8211; Hook + Setup</h2><p>You&#8217;re still using the default On&#8209;Premises Data Gateway settings. Fascinating. And you wonder why your Power&#8239;BI refreshes crawl like a dial&#8209;up modem in 1998.<br>Here&#8217;s the news you apparently skipped: the Power&#8239;Platform doesn&#8217;t talk directly to your databases. It sends every query, every Power&#8239;BI dataset refresh, every automated flow&#8212;through a single middleman called the Gateway. If that middleman&#8217;s tuned like a budget rental car, you get throttled performance no matter how shiny your Power&#8239;Apps interface looks.</p><p>The Gateway is the bridge between the cloud and your on&#8209;prem world. It takes cloud requests, authenticates them, encrypts the traffic, and executes queries against your local data sources. When it&#8217;s misconfigured, the entire Power&#8239;Platform stack&#8212;Power&#8239;BI, Power&#8239;Automate, Power&#8239;Apps&#8212;pays the price in latency, retry loops, and failed refresh sessions. It&#8217;s the bottleneck most administrators never optimize because, by default, Microsoft makes it &#8220;safe.&#8221; Safe means simple. Simple means slow.</p><p>By the end of this episode, you&#8217;ll know which settings are quietly strangling your throughput, why the defaults exist, and how to re&#8209;engineer the connection flow so you can stop babysitting overnight refreshes like a nervous parent with a baby monitor.</p><p>As M365 turns into the integration glue of your data estate, the Gateway has become its weakest link&#8212;hidden, neglected, but critical. And, spoiler alert, the fix isn&#8217;t more hardware or another restart. It&#8217;s correcting two silent killers: <strong>default routing</strong> and <strong>default concurrency.</strong> One defines <em>where</em> your traffic travels; the other limits <em>how much</em> can travel simultaneously.<br>Keep those in mind, because they&#8217;re about to make you rethink everything you assumed about &#8220;working connections.&#8221;</p><div><hr></div><h2>Section&#8239;1&#8239;&#8211;&#8239;The&#8239;Misunderstood&#8239;Middleman:&#8239;What&#8239;the&#8239;Gateway&#8239;Actually&#8239;Does</h2><p>Most people think the On&#8209;Premises&#8239;Data&#8239;Gateway is a tunnel&#8212;cloud in, query out, job done. Incorrect. It&#8217;s closer to an airport customs checkpoint for data packets. Every request stepping off the Power&#8239;Platform &#8220;plane&#8221; gets inspected, its credentials stamped, its luggage&#8212;your data query&#8212;scanned for permissions, then reissued with new boarding papers to reach your on&#8209;prem SQL&#8239;Server or file share. That process takes work: translation, encryption, compression, and sometimes caching. None of that is free.</p><p>Think of the cloud service&#8212;Power&#8239;BI, Power&#8239;Automate&#8212;as a delegate sending tasks to your local environment. The request hits the Gateway cluster first, which decides which host machine will process it. That host then manages authentication, opens a secure channel, queries the data source, and returns results back up the chain. The flow is: service&#8239;&#8594;&#8239;gateway&#8239;cluster&#8239;&#8594;&#8239;gateway&#8239;host&#8239;&#8594;&#8239;data&#8239;source&#8239;&#8594;&#8239;return. Each arrow represents CPU cycles, memory allocations, and network hops. Treating the Gateway as a &#8220;dumb relay&#8221; is like assuming the translator at the United&#8239;Nations just repeats words&#8212;no nuance, no context. In reality, it negotiates formats, encodings, and security protocols on the fly.</p><p>Microsoft gives you three flavors of this translator.<br><strong>Standard&#8239;Mode</strong> is the enterprise edition&#8212;the one you should be using. It supports clustering, load&#8239;balancing, and shared use by multiple services.<br><strong>Personal&#8239;Mode</strong> is the single&#8209;user toy version&#8212;fine for an analyst working alone but disastrous for shared environments because it ignores clustering completely.<br>And <strong>VNet&#8239;Gateways</strong> run inside Azure Virtual&#8239;Network subnets to avoid exposing on&#8209;prem ports at all; they&#8217;re ideal when your data already lives partly in Azure. Mix these modes carelessly and you&#8217;ll create a diplomatic incident worthy of its own headline.</p><p>The Gateway also performs local caching. When consecutive refreshes hit the same data, that cache reduces roundtrips&#8212;but it means the Gateway devours memory faster than most admins expect. Add concurrency&#8212;the number of simultaneous queries&#8212;and you&#8217;ve just discovered why your CPU spikes exist. Encryption of every payload adds another layer of cost. All of this happens invisibly while users blame &#8220;Power&#8239;BI slowness.&#8221;</p><p>So no, it&#8217;s not a straw. It&#8217;s a full&#8209;blown processing engine squeezed into a small Windows&#8239;service, juggling encryption keys, TLS handshakes, streaming buffers, and queued refreshes, all while the average user forgets it even exists. Picture it as the nervous bilingual courier translating for two impatient executives&#8212;Microsoft&#8239;Cloud on one side, your SQL&#8239;Server on the other&#8212;both yelling for instantaneous results while it flips encrypted note cards at lightning speed.</p><p>Now that you&#8217;ve finally met the real Gateway&#8212;not a tunnel, not a relay, but a translator under constant load&#8212;let&#8217;s face the uncomfortable truth: you&#8217;ve been choking it with the same factory settings Microsoft ships for minimal support calls. Time to open the hood and see just how those defaults quietly throttle your data velocity.</p><h2>Section&#8239;2&#8239;&#8211;&#8239;Default&#8239;Settings:&#8239;The&#8239;Hidden&#8239;Performance&#8239;Killers</h2><p>Here&#8217;s the blunt truth: Microsoft&#8217;s default Gateway configuration is designed for safety, not speed. It assumes your data traffic is a fragile toddler that must never stumble, even if it crawls at the pace of corporate approval workflows. Reliability is good&#8212;but when your Power&#8239;BI refresh takes an hour instead of twelve&#8239;minutes, you&#8217;ve traded stability for lethargy.</p><p>Start with <strong>concurrency.</strong> By default, the Gateway allows a pitiful number of simultaneous queries&#8212;usually one thread per data source per node. That sounds tidy until you remember each refresh triggers multiple queries. One Power&#8239;BI dataset with half a dozen tables means serial execution; everything lines up politely, waiting for a turn like British commuters at a bus stop. You, meanwhile, watch dashboards updating in slow motion. Increasing concurrent queries lets the Gateway chew through multiple requests in parallel&#8212;but, of course, that eats CPU and RAM. Balance matters; starving it of resources while raising concurrency is like telling one employee to do five people&#8217;s jobs faster.</p><p>Then there&#8217;s <strong>buffer sizing,</strong> the forgotten setting that dictates how much data the Gateway can handle in&#8239;memory before it spills to disk. The default assumes tiny payloads&#8212;useful when reports were a few&#8239;megabytes, disastrous when they&#8217;re gigabytes of transactional detail. Once buffers overflow, the Gateway starts paging data to disk. If that disk isn&#8217;t SSD&#8209;based, congratulations: you just introduced mechanical delays measurable in geological time. Expand the buffer within reason; let RAM handle what it&#8217;s good at&#8212;short&#8209;term blitz processing.</p><p>A micro&#8209;story to prove the point.<br>An analyst once bragged that his model refreshed in twelve&#8239;minutes. After a routine Gateway update, refresh time ballooned to sixty&#8239;minutes. Same&#8239;data, same&#8239;hardware. The culprit? Update reset the concurrency limit and buffer parameters to defaults. Essentially, the Gateway reverted to &#8220;training wheels&#8221; mode. A two&#8209;line configuration fix restored it to twelve&#8239;minutes. Moral: never assume updates preserve your tweaks; Microsoft&#8217;s setup wizard has a secret fetish for amnesia.</p><p>Next&#8239;villain: <strong>antivirus interference.</strong> The Gateway&#8217;s constantly reading and writing encrypted temp files, logs, and streaming chunks. An over&#8209;eager antivirus scans every read&#8209;write operation, throttling I/O so badly you might as well be running it on floppy disks. Exclude the Gateway&#8217;s installation and data directories from real&#8209;time scanning. You&#8217;re protecting code signed by Microsoft, not a suspicious USB stick from accounting.</p><p>Now, <strong>CPU and memory correlation.</strong> Think of CPU as the Gateway&#8217;s&#8239;mouth and RAM as its&#8239;lungs. Crank concurrency or enable streaming without scaling resources, and you give it the lung capacity of a hamster expected to sing an opera. Refreshes extend, throttling kicks&#8239;in, and you call it &#8220;cloud latency.&#8221; Wrong&#8239;diagnosis. The host&#8217;s overwhelmed. Watch the performance counters&#8212;you&#8217;ll see the saw&#8209;tooth patterns of queued queries wheezing for resources.</p><p>Speaking of streaming: there&#8217;s a deceptive little toggle named <code>StreamBeforeRequestCompletes.</code> Enabled, it starts shipping rows to the cloud before an entire query finishes. On low&#8209;latency networks, it feels magical&#8212;data begins arriving sooner, reports render faster. But stretch that same configuration across a weak&#8239;VPN or high&#8209;latency WAN, and it collapses spectacularly. Streaming multiplies open connections, fragile paths desynchronize, and half&#8209;completed transfers trigger retry storms. Use&#8239;it&#8239;only inside stable, high&#8209;bandwidth networks; disable it when reaching through wobbly&#8239;tunnels.</p><p>And about those tunnels&#8212;your <strong>network path</strong> itself may pretend to be healthy while sabotaging performance. Many admins route outbound Gateway traffic through corporate VPNs or centralized proxies &#8220;for security.&#8221; Admirable intention, catastrophic result. You&#8217;re adding&#8239;milliseconds of detour to every query hop while Microsoft&#8217;s own global network could have carried it directly from your office&#8239;edge to Azure&#8217;s backbone. The Gateway status light will still say &#8220;Healthy&#8221; because it measures reachability, not efficiency. Don&#8217;t mistake a pulse&#8239;for&#8239;fitness.</p><p>The pattern&#8239;here&#8239;should now be obvious: every &#8220;safe&#8221; default sacrifices velocity for predictability. They&#8217;re fine for demos, not for production. The moment you exceed a&#8239;handful of concurrent refreshes, they become a straitjacket.</p><p>So yes, fix your thread limits, expand your buffers, exclude the antivirus, and sanity&#8209;check that network path. Because right&#8239;now, you&#8217;ve built a Formula&#8239;One data engine&#8212;and you&#8217;re forcing&#8239;it&#8239;to idle&#8239;in&#8239;first&#8239;gear.</p><p>Next, we&#8217;ll examine why even perfect local tuning can&#8217;t save&#8239;you if your data&#8217;s taking the scenic&#8239;route through the public&#8239;internet instead of Microsoft&#8217;s freeway.</p><h2>Section&#8239;3&#8239;&#8211;&#8239;The&#8239;Network&#8239;Factor:&#8239;Routing,&#8239;Latency,&#8239;and&#8239;Cold&#8239;Potato&#8239;Myths</h2><p>Your Gateway might be tuned like a race car now, but if the track it&#8217;s driving on is a dirt road, you&#8217;re still going to eat dust. Performance doesn&#8217;t stop at the server rack&#8212;it keeps traveling through your network cables, firewalls, and routers before it ever reaches Microsoft&#8217;s global backbone. And here&#8217;s where most admins commit the ultimate sin: forcing Power&#8239;Platform traffic through corporate VPNs and centralized proxies as if data integrity were best achieved by torture.</p><p>Let&#8217;s start with a quick reality check. Microsoft&#8217;s cloud operates on a <strong>cold&#8239;potato&#8239;routing</strong> model. In simple terms, whenever your data leaves your building and reaches the nearest edge of Microsoft&#8217;s network&#8212;called a&#8239;POP, or Point&#8239;of&#8239;Presence&#8212;Microsoft <em>keeps</em> that data on its private fiber backbone for as long as possible. That global network spans continents with redundant peering links and more than a hundred edge&#8239;sites; once traffic enters, latency drops dramatically because the rest of its journey rides on optimized fiber instead of the open internet&#8217;s spaghetti mess. Compare that to &#8220;hot&#8239;potato&#8239;routing,&#8221; where traffic leaves your ISP&#8217;s network almost immediately, bouncing from one third&#8209;party carrier to another before it ever touches Microsoft&#8217;s infrastructure. Cold&#8239;potato equals&#8239;less&#8239;friction. Hot&#8239;potato equals&#8239;digital&#8239;ping&#8209;pong.</p><p>And yet, many organizations sabotage this advantage. They insist on routing Power&#8239;Platform and M365 traffic back through headquarters&#8212;over VPN tunnels or web proxies&#8212;before letting it out to the internet. Why? Security theater. Everything feels &#8220;controlled,&#8221; even though you&#8217;ve just added several unnecessary network hops plus packet inspection delays from devices that were never built for high&#8209;volume TLS&#8239;traffic. Each hop adds 10,&#8239;20,&#8239;maybe&#8239;30&#8239;milliseconds. Add four&#8239;hops and you&#8217;ve doubled your latency before the query even sees Azure.</p><p>The truth is Microsoft&#8217;s network is more secure&#8212;and vastly faster&#8212;than your overworked firewall cluster. You paid for that performance as part of your license, then turned it off out of an outdated security habit. Stop doing that.</p><p>Now, visualize how connectivity works when done properly. You open a Power&#8239;BI dashboard in your branch office. The cloud service in Azure sends a request to the Gateway. That request exits your office through the local ISP line, hits the nearest Microsoft&#8239;edge&#8239;POP&#8212;say, in Frankfurt or Dallas depending on geography&#8212;and then rides Microsoft&#8217;s internal network right into the Azure&#8239;region hosting your tenant. No detours. No VPN loops. Just: <em>Office&#8239;&#8594;&#8239;Edge&#8239;POP&#8239;&#8594;&#8239;Microsoft&#8239;Backbone&#8239;&#8594;&#8239;Azure&#8239;Region.</em> That is the low&#8209;latency highway your packets dream about every night.</p><p>So where does &#8220;routing&#8239;preference&#8221; come in? Azure gives you options on how outbound traffic is delivered. The <strong>Microsoft&#8239;Network</strong> routing&#8239;preference keeps your data on that private backbone until the last possible moment&#8212;cold&#8239;potato&#8239;style. The <strong>Internet</strong> option does the opposite; it tosses your packets onto the open internet right away to save on bandwidth&#8239;costs. You can even split the difference using <strong>combination&#8239;mode,</strong> where the same resource&#8212;like a&#8239;storage&#8239;account&#8212;offers two endpoints, one carried through Microsoft&#8217;s backbone, the other through general internet routing. Smart teams test both and choose based on workload sensitivity. Analytical traffic? Use Microsoft&#8239;Network. Bulk&#8239;uploads or nightly logs? Internet option is adequate.</p><p>If you get this wrong, everything above&#8212;concurrency, buffers, hardware&#8212;becomes irrelevant. The Gateway can&#8217;t process data it hasn&#8217;t received yet. Latency is compound interest in reverse: every additional millisecond on the line lowers your throughput exponentially. So even if your refresh appears &#8220;healthy,&#8221; you may be losing half your real performance to congestion that your diagnostics never show.</p><p>Here&#8217;s where Microsoft&#8217;s thousand engineers have already done the hard work for you. Their global network interlinks over&#8239;60&#8239;Azure regions, with encryption baked in at Layer&#8239;2 and more than&#8239;190&#8239;edge&#8239;POPs positioned to keep every enterprise within roughly&#8239;25&#8239;milliseconds&#8239;of the network. You could never replicate that with your private MPLS or VPN backbone. When you correctly permit Power&#8239;Platform&#8239;traffic to egress locally and ride that backbone, you&#8217;ll cut end&#8209;to&#8209;end latency by up to&#8239;50&#8239;percent. Yes, half. The paradox is that &#8220;less&#8239;control&#8221; over routing actually produces more&#8239;security and predictability because you&#8217;re inside a network engineered for failover and telemetry rather than a generic corporate pipe.</p><p>Think of it like building a bridge. You could let your data swim through the public internet&#8217;s unpredictable currents&#8212;cheap, yes, but slow and occasionally shark&#8209;infested&#8212;or you could let Microsoft&#8217;s freeway carry it over the water on reinforced concrete. The freeway already exists. Your only job is to drive on it instead of taking the raft.</p><p>Of course, fixing the path only solves half the problem. A perfectly paved road doesn&#8217;t matter if your driver&#8212;meaning the Gateway&#8239;host itself&#8212;is still underpowered, coughing smoke, and trying to haul ten&#8239;tons of analytical data with one gigabyte of&#8239;RAM. So next, let&#8217;s build a real&#8239;vehicle worthy of that freeway.</p><h2>Section&#8239;4&#8239;&#8211;&#8239;Hardware&#8239;and&#8239;Hosting:&#8239;Build&#8239;a&#8239;Real&#8239;Gateway&#8239;Host</h2><p>Let&#8217;s start by dismantling a myth: the On&#8209;Premises&#8239;Data&#8239;Gateway is not some elastic Azure service that auto&#8209;scales just because you upgrade your license. It&#8217;s a Windows service chained to the physical reality of the machine it&#8217;s running on. Give&#8239;it lightweight hardware, and it will perform like one. Give&#8239;it compute muscle, and suddenly your refreshes stop wheezing.</p><p>Minimum specs? Microsoft lists eight&#8239;GB&#8239;of&#8239;RAM and a modest quad&#8209;core CPU. Those numbers exist purely to keep support calls civil. Real&#8209;world production? You want at&#8239;least sixteen&#8239;gigabytes&#8239;of&#8239;RAM and as&#8239;many dedicated physical cores as your budget&#8239;permits&#8212;eight&#8239;cores&#8239;should be your starting point, not the finish line. Remember, every concurrent query consumes a thread and a share of memory; multiple refreshes compound that load. Starve it of resources, and the scheduler queues everything like a slow cafeteria line. Feed it, and you unlock genuine parallelism.</p><p>Storage matters too. The Gateway caches data, logs, and temp&#8239;files incessantly. If those land on a mechanical disk, you&#8217;ve just equipped a race car with bicycle tires. Move logs&#8239;and&#8239;cache to an SSD&#8239;or&#8239;NVMe&#8239;drive; latency from disk operations drops from&#8239;milliseconds to&#8239;microseconds. The effect shows up instantly in refresh duration graphs. I&#8217;ve seen hour&#8209;long refreshes shrink to twenty&#8239;minutes because someone swapped the hard&#8239;drive.</p><p>Next: <strong>virtual&#8239;machines versus&#8239;physical&#8239;hosts.</strong> VMs work&#8212;but only when they&#8217;re treated like reserved citizens, not tenants in an overcrowded apartment. Dedicate CPU&#8239;sockets, lock memory allocations, and disable overcommit. Shared infrastructure steals cycles the Gateway needs for encryption and query parallelism. Cloud&#8239;admins often mistakenly host the Gateway on a general&#8209;purpose utility&#8239;VM. Then they wonder why performance fluctuates like mood lighting. If you insist on virtualization, use fixed resources. If not, go&#8239;physical and spare yourself the throttling.</p><p>Now, if one machine runs well, several run better. That brings us to <strong>clusters.</strong> A Gateway cluster is two&#8239;or&#8239;more host machines registered under the same Gateway&#8239;name. The Power&#8239;Platform automatically load&#8209;balances across them, distributing queries based on availability. This isn&#8217;t high&#8239;availability through magic&#8212;each node still needs the same&#8239;version&#8239;and&#8239;configuration&#8212;but it&#8217;s simple redundancy that doubles or triples throughput while insulating against patch&#8209;night disasters. Think of clustering as giving the Gateway a relay&#8239;team instead of one exhausted&#8239;runner.</p><p>To know whether your host is sufficient, stop guessing and start <strong>monitoring.</strong> Microsoft ships a Gateway&#8239;Performance&#8239;template for Power&#8239;BI&#8212;it visualizes CPU&#8239;usage, memory pressure, query&#8239;duration, and concurrent&#8239;connections. Use&#8239;it. If&#8239;you see CPU pinned&#8239;above&#8239;80&#8239;percent or&#8239;memory saturating&#8239;as refreshes&#8239;start, you&#8217;ve confirmed an under&#8209;powered&#8239;host. Complement&#8239;that with Windows&#8239;Performance&#8239;Monitor counters: Processor&#8239;%&#8239;Processor&#8239;Time, Memory&#8239;Available&#8239;MBytes, and the GatewayService&#8217;s private&#8239;bytes. Watch for patterns; if metrics climb predictably during scheduled refreshes, you&#8217;ve maxed&#8239;capacity.</p><p>Also&#8239;enable enhanced&#8239;logging. Newer builds include per&#8209;query&#8239;timestamps so you can trace slow segments of the refresh&#8239;pipeline. You&#8217;ll often find that apparent &#8220;network&#8239;latency&#8221; is actually the host spilling buffers to disk&#8212;clear evidence of inadequate&#8239;RAM. Logs&#8239;don&#8217;t lie; they just require someone competent enough to&#8239;read&#8239;them.</p><p>One&#8239;final reminder: hardware tuning and monitoring are not optional chores&#8212;they are infrastructure hygiene. You patch Windows, you update&#8239;firmware, you&#8239;watch&#8239;event&#8239;logs. The Gateway deserves the same&#8239;discipline. Ignore&#8239;it&#8239;and&#8239;you&#8217;ll spend nights performing ritual&#8239;service&#8239;restarts and blaming invisible&#8239;ghosts.</p><p>Because&#8239;even flawless network&#8239;routing can&#8217;t redeem a Gateway&#8239;host built on undersized hardware with forgotten&#8239;logs, outdated&#8239;drivers, and shared&#8239;resources. The&#8239;cloud&#8217;s backbone&#8239;may&#8239;be&#8239;a&#8239;superhighway&#8212;but&#8239;if&#8239;your&#8239;vehicle&#8239;runs&#8239;on&#8239;bald&#8239;tires&#8239;and&#8239;missing&#8239;spark&#8239;plugs,&#8239;you&#8217;re&#8239;stuck&#8239;in&#8239;the&#8239;breakdown&#8239;lane.</p><p>Next&#8239;up: why staying&#8239;fast requires staying&#8239;vigilant&#8212;version&#8239;control,&#8239;maintenance&#8239;schedules,&#8239;and&#8239;automation&#8239;that&#8239;keeps&#8239;your&#8239;Gateway&#8239;healthy&#8239;before&#8239;it&#8239;begs&#8239;for&#8239;resuscitation.</p><h2>Section&#8239;5&#8239;&#8211;&#8239;Proactive&#8239;Optimization&#8239;and&#8239;Maintenance</h2><p>Let&#8217;s talk about the part admins treat like flossing&#8212;maintenance. They know they should, but somehow forget until everything starts rotting. The On&#8209;Premises&#8239;Data&#8239;Gateway isn&#8217;t a &#8220;set&#8209;and&#8209;forget&#8221; component; it&#8217;s living software, and like any living thing it decays when neglected.</p><p>First rule: <strong>never auto&#8209;apply updates.</strong> I know, shocking advice from someone defending Microsoft technology, but hear me out. Each release may contain performance improvements&#8212;or new, undiscovered side effects. Automatic updates replace stable binaries and occasionally reset critical configuration files to that hated &#8220;safe default&#8221; mode. Stage new versions in a sandbox first. Spin up a secondary Gateway instance, clone your configuration, then schedule a test refresh cycle. If throughput and log consistency hold steady, promote that version to production. If not, roll back gracefully while the rest of the world panics on the community forum.</p><p>That brings us to <strong>rollback hygiene.</strong> Keep local backups of your configuration files: <code>GatewayClusterSettings.json</code> and <code>GatewayDataSource.xml</code>. Copy them before each upgrade. The Gateway doesn&#8217;t ask politely before overwriting them. Version&#8209;pinning the installer&#8212;the exact MSI build number&#8212;is your insurance policy. Microsoft&#8217;s download archive lists previous builds for a reason. Think of it like keeping old driver versions; sometimes stability is worth a week&#8217;s delay on flashy new features.</p><p>Now, onto <strong>continuous monitoring.</strong> You wouldn&#8217;t drive a performance car without a dashboard; stop running your gateway blind. Every week, open the Power&#8239;BI&#8239;Gateway&#8239;Performance&#8239;report and correlate CPU, memory, and query&#8209;duration spikes with scheduled refresh jobs. Patterns reveal inefficiencies. Perhaps your Monday&#8209;morning sales refresh collides with finance&#8217;s dataflow run. Adjust the Power&#8239;Automate triggers, spread the load. You&#8217;ll witness the bell curve flatten and the cries of &#8220;Power&#8239;BI&#8239;is&#8239;slow&#8221; mysteriously vanish.</p><p>Don&#8217;t just stare at charts&#8212;act on them. Automate health checks with PowerShell. Microsoft&#8217;s <code>Get&#8209;OnPremisesDataGatewayStatus</code> cmdlet will query connectivity, cluster state, and update level. Wrap it in a scheduled script that emails a summary before business hours: CPU&#8239;average, queued&#8239;requests, and last&#8239;refresh&#8239;status. If metrics exceed thresholds, restart the gateway service proactively. Yes, I said restart <em>before</em> users complain. Preventive rebooting flushes stale network&#8239;handles and clears temporary file bloat. A ten&#8209;second interruption beats a two&#8209;hour outage.</p><p>Let&#8217;s discuss <strong>token management.</strong> In older builds, long&#8209;running refreshes occasionally failed because authentication tokens expired mid&#8209;query. Recent versions handle token renewal asynchronously&#8212;another reason to upgrade deliberately, not impulsively. Re&#8209;registering your data sources after major updates ensures the token handshake process uses the latest schema. Translation: fewer silent 403&#8239;errors at&#8239;3&#8239;a.m.</p><p>The next discipline is <strong>environmental awareness.</strong> The Gateway host sits at the intersection of firewall rules, OS&#8239;patching, and enterprise security software. Each of those layers can introduce latency or incompatibility. Maintain a documented &#8220;baseline configuration&#8221;: Windows&#8239;version, .NET&#8239;framework&#8239;build, antivirus exclusions list, and network&#8239;ports open. When something slows, compare the current state to that baseline. ninety&#8239;percent of performance losses trace back to a quietly re&#8209;enabled security setting or a background agent that matured into a resource hog overnight.</p><p>Human behavior, however, is the biggest bottleneck. Too many admins treat the gateway as an afterthought until executives complain about late dashboards. Reverse that order. Schedule quarterly maintenance windows specifically for gateway tuning. Review the logs, validate capacity, test failover between clustered nodes, and&#8212;critically&#8212;document what you changed. The next administrator should be able to follow your breadcrumbs rather than reinvent the disaster.</p><p>For teams obsessed with automation, integrate the gateway lifecycle into DevOps. Store configuration files in version control, script deployment with PowerShell or Desired&#8239;State&#8239;Configuration, and you&#8217;ll transform a fragile Windows&#8239;service into code&#8209;defined infrastructure. The benefit isn&#8217;t geek prestige&#8212;it&#8217;s repeatability. When a machine fails, you rebuild it identically rather than &#8220;approximately.&#8221;</p><p>And if you need motivation, quantify the outcome. Faster refresh cycles mean executives base decisions on data that&#8217;s hours old, not yesterday&#8217;s&#8239;export. A one&#8209;hour gain in refresh time translates directly into more responsive Power&#8239;Apps and fewer retried Power&#8239;Automate&#8239;flows. Multiply that by hundreds of daily users and you realize the business impact dwarfs the cost of a decently specced host.</p><p>So yes, the Gateway isn&#8217;t broken&#8212;you simply never treated it like infrastructure. It deserves patch cycles, performance audits, and automation scripts, not post&#8209;failure therapy sessions. Maintain it, and you&#8217;ll stop chasing ghosts in the middle of the night. Ignore it, and those ghosts will invoice you in downtime.</p><div><hr></div><h2>Conclusion&#8239;&#8211;&#8239;The&#8239;Takeaway</h2><p>Let&#8217;s distill this into one uncomfortable truth: the On&#8209;Premises&#8239;Data&#8239;Gateway is <strong>infrastructure</strong>, not middleware. It&#8217;s the plumbing between your on&#8209;premises data and Microsoft&#8217;s cloud, and plumbing obeys physics. Defaults are &#8220;safe,&#8221; but safety trades away performance.</p><p>You wouldn&#8217;t run SQL&#8239;Server on its out&#8209;of&#8209;box power plan and expect lightning results. Yet people install a Gateway, click&#8239;Next&#8239;five&#8239;times, and wonder why their refreshes crawl. The answer hasn&#8217;t changed after two&#8239;decades of computing: tune&#8239;it, monitor&#8239;it, scale&#8239;it.</p><p>The playbook is simple.<br>Step&#8239;one: stop assuming defaults are sacred&#8212;raise concurrency and buffer limits within the capacity of your host.<br>Step&#8239;two: let Microsoft&#8217;s network handle the routing; disable that corporate VPN detour.<br>Step&#8239;three: build a gateway host worthy of its workload&#8212;SSD&#8239;storage, 16&#8239;GB&#8239;RAM&#8239;minimum, multiple&#8239;cores, cluster redundancy.<br>Step&#8239;four: treat updates and monitoring as continuous operations, not emergency measures.</p><p>Do those consistently and your &#8220;slow Power&#8239;BI dataset&#8221; will transform into something almost unrecognizable&#8212;efficient, predictable, maybe even boring. Which is the highest compliment infrastructure can earn.</p><p>Your Power&#8239;BI isn&#8217;t slow. Your negligence&#8239;is.</p><p>So before closing this video, test your latency to the nearest Microsoft&#8239;edge&#8239;POP, open your Gateway&#8239;Performance&#8239;report, and schedule that PowerShell health&#8239;check. Then watch the next episode on routing optimization across the M365&#8239;ecosystem&#8212;because the true hybrid data backbone isn&#8217;t built by luck; it&#8217;s engineered.</p><p>Entropy wins when you do nothing. Subscribing fixes that. Press&#8239;Follow, enable&#8239;notifications, and let structured knowledge arrive on schedule. Maintain your curiosity the same way you maintain your Gateway&#8212;regularly, intentionally, and before it breaks.</p>]]></content:encoded></item></channel></rss>