<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sofiane Mebchour</title>
    <description>The latest articles on DEV Community by Sofiane Mebchour (@sofianem8).</description>
    <link>https://dev.to/sofianem8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4015888%2F72301df6-8f4b-4efa-9e9e-adb79d303ec7.png</url>
      <title>DEV Community: Sofiane Mebchour</title>
      <link>https://dev.to/sofianem8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sofianem8"/>
    <language>en</language>
    <item>
      <title>Responsive Power Apps in 2026: Containers, Breakpoints and Wrap</title>
      <dc:creator>Sofiane Mebchour</dc:creator>
      <pubDate>Fri, 16 Oct 2026 12:17:04 +0000</pubDate>
      <link>https://dev.to/sofianem8/responsive-power-apps-in-2026-containers-breakpoints-and-wrap-1862</link>
      <guid>https://dev.to/sofianem8/responsive-power-apps-in-2026-containers-breakpoints-and-wrap-1862</guid>
      <description>&lt;p&gt;Many canvas apps pin every control to absolute &lt;code&gt;X&lt;/code&gt;/&lt;code&gt;Y&lt;/code&gt; coordinates at one design size, and look wrong at any other: a label overlapping a button on a laptop, dead space on a tablet, horizontal scrolling on a phone.&lt;/p&gt;

&lt;p&gt;Power Apps has had proper responsive layout tools — &lt;strong&gt;horizontal and vertical layout containers&lt;/strong&gt; — for several years. Here's how to build screens that adapt, and the limits worth knowing before you commit to a layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why fixed positioning breaks
&lt;/h2&gt;

&lt;p&gt;A control with &lt;code&gt;X: 850, Y: 120, Width: 300&lt;/code&gt; is correct for exactly one screen size. With &lt;strong&gt;Scale to fit&lt;/strong&gt; on, Power Apps' answer to other sizes is to render your app at its design resolution and scale the whole thing like an image: text gets smaller, touch targets shrink, and a phone shows a miniature desktop app.&lt;/p&gt;

&lt;p&gt;The alternative is real responsiveness: the app uses the actual window size, and your layout &lt;em&gt;reflows&lt;/em&gt;. That takes two changes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Settings &amp;gt; Display: turn off "Scale to fit".&lt;/strong&gt; (Older Studio versions and some Microsoft pages call this area &lt;em&gt;File &amp;gt; Settings &amp;gt; Screen size + orientation&lt;/em&gt;.) Turning it off also switches off and disables &lt;strong&gt;Lock aspect ratio&lt;/strong&gt;. &lt;strong&gt;Lock orientation&lt;/strong&gt; is a separate setting — turn it off too if the app should follow device rotation. With Scale to fit off, &lt;code&gt;App.Width&lt;/code&gt; and &lt;code&gt;App.Height&lt;/code&gt; change as the window is resized.&lt;/li&gt;
&lt;li&gt;Stop positioning controls with absolute numbers, and let containers do it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You &lt;em&gt;could&lt;/em&gt; make every control's &lt;code&gt;X&lt;/code&gt;/&lt;code&gt;Y&lt;/code&gt;/&lt;code&gt;Width&lt;/code&gt; a formula referencing &lt;code&gt;Parent.Width&lt;/code&gt; — Microsoft documents that technique, including a centering pattern of the form &lt;code&gt;(Parent.Width - C.Width) / 2&lt;/code&gt;, where &lt;code&gt;C&lt;/code&gt; is the control being centered (the &lt;code&gt;Self&lt;/code&gt; operator can stand in for its own name) — but a screen full of that math is miserable to maintain. Containers exist so you don't have to.&lt;/p&gt;

&lt;p&gt;One testing caveat from Microsoft's documentation: the authoring canvas in Studio doesn't respond to these sizing formulas. Test in a published app, or in Preview — and if you resize the browser window while Preview is open, close and reopen Preview, because it may not update correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Containers in 90 seconds
&lt;/h2&gt;

&lt;p&gt;The controls that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Horizontal container&lt;/strong&gt; — lays out children left to right and manages their &lt;code&gt;X&lt;/code&gt; for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vertical container&lt;/strong&gt; — lays out children top to bottom and manages their &lt;code&gt;Y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt; — a container in manual layout. Its children keep their own &lt;code&gt;X&lt;/code&gt;/&lt;code&gt;Y&lt;/code&gt;/&lt;code&gt;Width&lt;/code&gt;/&lt;code&gt;Height&lt;/code&gt;, so it groups and nests controls under a common parent but doesn't position them for you; responsiveness inside it still relies on formulas based on &lt;code&gt;Parent.Width&lt;/code&gt; and &lt;code&gt;Parent.Height&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grid container&lt;/strong&gt; — a newer control that places children by rows and columns. Microsoft's controls index has labelled it as preview, so check its status in your version of Studio before relying on it in production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside a layout container, the children's position properties are taken over by the container. You stop thinking in coordinates and start thinking in structure. (Microsoft notes that drag and drop on the canvas is disabled inside layout containers: you reorder children in the Tree view or with the arrow keys, and controls moved into a container are inserted in their Tree-view order.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Screen
└─ Vertical container (X 0, Y 0, Width Parent.Width, Height Parent.Height, Align (horizontal): Stretch)
   ├─ Horizontal container  ← header, fixed height 64
   ├─ Horizontal container  ← content, flexible height (Fill portions 1), Align (vertical): Stretch
   │  ├─ Vertical container ← sidebar, fixed width 280
   │  └─ Vertical container ← main area, flexible width (Fill portions 1)
   └─ Horizontal container  ← footer, fixed height 48
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a classic app shell — header, sidebar, content, footer. The top-level container is sized to its parent (Microsoft's documented setup); everything inside it is laid out by the containers rather than by position formulas. Resize the window and the main area absorbs the change, while the header and footer keep their fixed height and the sidebar keeps its fixed width.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixed sizes vs Fill portions
&lt;/h2&gt;

&lt;p&gt;Each child of a layout container sizes along the container's main axis in one of two ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fixed size&lt;/strong&gt; — "this button is 120 wide, always."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible width / Flexible height with Fill portions&lt;/strong&gt; — "give this child a share of whatever space is left."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fill portions are relative weights over the container's &lt;em&gt;extra&lt;/em&gt; space — the space left once the fixed children are placed. Two flexible children with portions &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;2&lt;/code&gt; get one third and two thirds of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Horizontal container (width: Parent.Width)
├─ Gallery       flexible width, Fill portions: 2
└─ Detail panel  flexible width, Fill portions: 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pattern that makes real layouts work is &lt;strong&gt;mixing the two in one container&lt;/strong&gt;: fixed sizes for chrome (icons, buttons, sidebars), flexible sizes for content. A search bar that fills the space between a fixed logo and a fixed avatar button:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Horizontal container
├─ Logo           fixed 140
├─ Search input   flexible width, Fill portions: 1
└─ Avatar button  fixed 48
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the cross axis, set the container's &lt;strong&gt;Align&lt;/strong&gt; property to &lt;strong&gt;Stretch&lt;/strong&gt; (Microsoft's walkthroughs label it &lt;em&gt;Align (vertical)&lt;/em&gt; on a horizontal container and &lt;em&gt;Align (horizontal)&lt;/em&gt; on a vertical one, but Studio labels vary between pages and versions — rely on the formula-bar name &lt;code&gt;LayoutAlignItems&lt;/code&gt;, with values Start, Center, End and Stretch). A stretched vertical container inside a horizontal one is how you get equal-height columns without ever setting a &lt;code&gt;Height&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimum sizes
&lt;/h2&gt;

&lt;p&gt;Flexible children can get very narrow on a small screen, and fixed children can overflow it. The platform gives you two floors to set deliberately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Per child:&lt;/strong&gt; layout-container children have a &lt;strong&gt;Minimum width&lt;/strong&gt; / &lt;strong&gt;Minimum height&lt;/strong&gt; (&lt;code&gt;LayoutMinWidth&lt;/code&gt; / &lt;code&gt;LayoutMinHeight&lt;/code&gt; in the formula bar) — the minimum size of the child in the direction of the Fill portions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per app:&lt;/strong&gt; the app has &lt;code&gt;MinScreenWidth&lt;/code&gt; and &lt;code&gt;MinScreenHeight&lt;/code&gt;. In Microsoft's responsive-layout page the default screen width is &lt;code&gt;Max(App.Width, App.MinScreenWidth)&lt;/code&gt;, so below that floor the screen stops shrinking and the user scrolls; another Microsoft page describes the formula as &lt;code&gt;Max(App.Width, App.DesignWidth)&lt;/code&gt; once Scale to fit is off, so check the &lt;code&gt;Width&lt;/code&gt; formula on your own screens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still plan the "too narrow" case explicitly with a breakpoint (next section): switch a container to vertical, or hide the element.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breakpoints
&lt;/h2&gt;

&lt;p&gt;There's no CSS media query in Power Apps, but there is built-in breakpoint support. Every screen has a &lt;strong&gt;Size&lt;/strong&gt; property (&lt;code&gt;ScreenSize.Small&lt;/code&gt;, &lt;code&gt;Medium&lt;/code&gt;, &lt;code&gt;Large&lt;/code&gt;, &lt;code&gt;ExtraLarge&lt;/code&gt;) computed from &lt;code&gt;App.SizeBreakpoints&lt;/code&gt;, which you can customize. Microsoft documents the defaults for tablet and web apps as &lt;code&gt;[600, 900, 1200]&lt;/code&gt;, and its own example uses it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// A control's Visible property: show only from "Medium" up
Parent.Size &amp;gt;= ScreenSize.Medium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside a container, &lt;code&gt;Parent&lt;/code&gt; is the container, not the screen — so reference the screen by name instead (for example &lt;code&gt;HomeScreen.Size&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;If you want your own thresholds, define them as &lt;strong&gt;named formulas in the App object's &lt;code&gt;Formulas&lt;/code&gt; property&lt;/strong&gt; (named formulas belong there, not in &lt;code&gt;OnStart&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// App.Formulas
nfBreakpoint = If(App.Width &amp;lt; 640, "sm", App.Width &amp;lt; 1024, "md", "lg");
nfIsMobile = App.Width &amp;lt; 640;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A named formula is declarative: it updates when the values it depends on change, and &lt;code&gt;App.Width&lt;/code&gt; changes as the window is resized. A &lt;code&gt;Set()&lt;/code&gt; in &lt;code&gt;OnStart&lt;/code&gt; runs once at startup and doesn't follow a resize. Resize a published app once to confirm it behaves that way in yours. (The 640 and 1024 above are illustrative, and they assume a tablet/web-format app — apps created in phone format use different default breakpoints, so check your own app's format.)&lt;/p&gt;

&lt;p&gt;Then drive layout properties from the formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// A container's Direction (LayoutDirection in the formula bar): a two-column section
// that stacks on phones. Pick the values from the formula bar's suggestions if your
// Studio version names them differently.
If(nfIsMobile, LayoutDirection.Vertical, LayoutDirection.Horizontal)

// Sidebar container's Visible property: hidden on phones, shown from "md" up
nfBreakpoint &amp;lt;&amp;gt; "sm"

// Container padding: tighter on phones, wider elsewhere
// (set PaddingLeft and PaddingRight, or whichever sides you use)
If(nfIsMobile, 16, 40)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A context variable set once in &lt;code&gt;Screen.OnVisible&lt;/code&gt; is the wrong tool here: it doesn't recalculate, so it won't follow a later window resize or a rotation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap
&lt;/h2&gt;

&lt;p&gt;Horizontal and vertical containers both have a &lt;strong&gt;Wrap&lt;/strong&gt; property. With wrap on, children that don't fit flow onto the next row (or column), which turns a container of fixed-width cards into a responsive card grid without positioning formulas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Horizontal container (Wrap: on, Gap: 16, flexible height, vertical overflow: scroll)
├─ Card 1 (fixed 320)
├─ Card 2 (fixed 320)
├─ Card 3 (fixed 320)
└─ ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give the wrapping container flexible height and vertical scrolling — Microsoft's own wrapping recipe does the same — otherwise the wrapped rows can be clipped when the window is narrow. With 320-wide cards and a 16 gap, a row holds four cards once the container's inner width (its width minus padding) reaches 1,328 px (4 × 320 + 3 × 16), three from 992 px and two from 656 px; below that, expect one card per row. Those thresholds are derived from the sizes above, not figures from Microsoft's documentation. One documented limitation: when Wrap is on, the Align setting of the child controls is ignored.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits worth knowing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Spacing lives on the container.&lt;/strong&gt; Use the container's &lt;code&gt;Gap&lt;/code&gt; for spacing between children and its padding (&lt;code&gt;PaddingTop&lt;/code&gt;, &lt;code&gt;PaddingRight&lt;/code&gt;, &lt;code&gt;PaddingBottom&lt;/code&gt;, &lt;code&gt;PaddingLeft&lt;/code&gt;) for inset. Invisible spacer rectangles make layouts fragile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not every control works inside layout containers.&lt;/strong&gt; Microsoft's known-issues list for auto-layout containers says that, at the time of writing, &lt;strong&gt;Data table, Charts and Add picture&lt;/strong&gt; aren't supported inside them. Separately, the reference page for the Container control lists its own limitations: containers don't work within forms, and Data table, PDF viewer and Web barcode scanner aren't supported inside it. Check both pages before you design a screen around one of those controls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alignment edge cases.&lt;/strong&gt; Besides Wrap ignoring the children's Align, Microsoft notes that Center or End justification combined with scrolling can leave children unreachable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Galleries are sized like any other child of a layout container.&lt;/strong&gt; To let a gallery take the remaining space, give it flexible height with Fill portions rather than a fixed height, and let the container own the size. Don't confuse this with the &lt;em&gt;Flexible height&lt;/em&gt; gallery type, which is about items of variable height, and check the exact property names in your version of Studio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nest only as deep as the layout needs.&lt;/strong&gt; Containers can be nested; each extra level is one more container to reason about when something doesn't resize as you expect.&lt;/p&gt;

&lt;p&gt;A shorter checklist version of this — the settings, the container setup and the breakpoint pattern — is in the &lt;a href="https://www.powerblocks.dev/guides/power-apps-responsive-containers" rel="noopener noreferrer"&gt;responsive containers guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start from a working skeleton
&lt;/h2&gt;

&lt;p&gt;Starting a responsive screen from a blank canvas is slow, and a reusable starting point removes much of that cost. Since Power Apps supports YAML copy-paste, a screen layout is a text snippet you can keep in a repo and paste into the tree view.&lt;/p&gt;

&lt;p&gt;PowerBlocks has three free &lt;a href="https://www.powerblocks.dev/library?view=layouts" rel="noopener noreferrer"&gt;layout skeletons&lt;/a&gt; — a dashboard, a list/browse screen and a master-detail screen. To be precise about what they are: they're manual-layout containers whose &lt;code&gt;X&lt;/code&gt;, &lt;code&gt;Y&lt;/code&gt;, &lt;code&gt;Width&lt;/code&gt; and &lt;code&gt;Height&lt;/code&gt; are formulas based on the parent's size (mostly &lt;code&gt;Parent.Width&lt;/code&gt;, some &lt;code&gt;Parent.Height&lt;/code&gt;), mixed with a few fixed values — you paste them and fill each region with your own controls. They are &lt;strong&gt;not&lt;/strong&gt; built on auto-layout containers or Fill portions, so the Direction, Gap and Wrap properties described above don't apply to them, and they don't ship with breakpoint formulas. To add one, drive each region's &lt;code&gt;X&lt;/code&gt;, &lt;code&gt;Y&lt;/code&gt;, &lt;code&gt;Width&lt;/code&gt;, &lt;code&gt;Height&lt;/code&gt; (and &lt;code&gt;Visible&lt;/code&gt;) from a named formula such as &lt;code&gt;nfIsMobile&lt;/code&gt;; the comments inside the YAML suggest setting a context variable in &lt;code&gt;Screen.OnVisible&lt;/code&gt;, but as explained above a named formula is the better tool. Or rebuild the skeleton with auto-layout containers and use the pattern in this article — build it once, save the YAML, and never start a responsive screen from zero again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Turn off Scale to fit (Lock aspect ratio switches off with it; Lock orientation is separate) and reference &lt;code&gt;App.Width&lt;/code&gt;, not pixels.&lt;/li&gt;
&lt;li&gt;Structure screens as nested horizontal/vertical containers.&lt;/li&gt;
&lt;li&gt;Fixed sizes for chrome, flexible sizes with Fill portions for content, Stretch on the cross axis.&lt;/li&gt;
&lt;li&gt;Set minimum sizes deliberately: per-child &lt;code&gt;LayoutMinWidth&lt;/code&gt;/&lt;code&gt;LayoutMinHeight&lt;/code&gt;, per-app &lt;code&gt;MinScreenWidth&lt;/code&gt;/&lt;code&gt;MinScreenHeight&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Screen.Size&lt;/code&gt; / &lt;code&gt;App.SizeBreakpoints&lt;/code&gt;, or named formulas in &lt;code&gt;App.Formulas&lt;/code&gt;, for breakpoints — not a one-time variable.&lt;/li&gt;
&lt;li&gt;Wrap gives you card grids without positioning formulas.&lt;/li&gt;
&lt;li&gt;Check Microsoft's known-issues and limitations pages for unsupported controls before committing to a layout.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Are you building canvas apps with containers, or still on fixed X/Y? If something specific keeps you away from containers, tell me in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>powerplatform</category>
      <category>lowcode</category>
      <category>responsivedesign</category>
    </item>
    <item>
      <title>Power Automate Error Handling That Actually Works: 429, 404, Timeouts and Retries</title>
      <dc:creator>Sofiane Mebchour</dc:creator>
      <pubDate>Thu, 01 Oct 2026 21:16:59 +0000</pubDate>
      <link>https://dev.to/sofianem8/power-automate-error-handling-that-actually-works-429-404-timeouts-and-retries-3ok8</link>
      <guid>https://dev.to/sofianem8/power-automate-error-handling-that-actually-works-429-404-timeouts-and-retries-3ok8</guid>
      <description>&lt;p&gt;Most Power Automate flows are built for the happy path. They run fine in testing, fine for a few weeks in production, and then one morning there are 40 failed runs in the history and a business process quietly stopped working three days ago.&lt;/p&gt;

&lt;p&gt;The failures are rarely exotic. A handful of HTTP status codes — &lt;strong&gt;429, 404, 500, 401&lt;/strong&gt; — plus timeouts are among the most common causes of failed runs. Each one has a different cause and a different fix, and handling them properly is a modest amount of extra work per flow. Here's a pattern that covers all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: actually read the error
&lt;/h2&gt;

&lt;p&gt;Before any pattern, a habit: open &lt;strong&gt;run history&lt;/strong&gt;, click the failed run, click the failing action, and read both the &lt;strong&gt;inputs&lt;/strong&gt; and the &lt;strong&gt;raw outputs&lt;/strong&gt;. The status code and message are right there, and they tell you which failure family you're in:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Typical cause&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;429&lt;/td&gt;
&lt;td&gt;Too Many Requests&lt;/td&gt;
&lt;td&gt;You exceeded a rate limit (the connector's or the underlying service's)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;Not Found&lt;/td&gt;
&lt;td&gt;The resource doesn't exist at that ID/path — deleted, renamed or moved, or the ID you sent was wrong (check the inputs for a value that came through empty)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Internal Server Error&lt;/td&gt;
&lt;td&gt;The service hit a problem — often transient. Read the raw outputs; a request the service rejects as invalid is more typically a 400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;Unauthorized&lt;/td&gt;
&lt;td&gt;The connection can no longer authenticate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;408 / ActionTimedOut&lt;/td&gt;
&lt;td&gt;Request timeout / action timed out&lt;/td&gt;
&lt;td&gt;A call exceeded its time limit (120 seconds for a synchronous request, or the timeout configured on the action); some timeouts surface as a 504 instead&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The inputs matter as much as the outputs. Many 404s are solved by looking at the failing action's inputs and noticing the ID it &lt;em&gt;actually&lt;/em&gt; used was empty — the dynamic content upstream had resolved to blank.&lt;/p&gt;

&lt;h2&gt;
  
  
  429: you're being throttled
&lt;/h2&gt;

&lt;p&gt;Connectors, and the services behind them, enforce their own rate limits (the unit and the time window vary), and a 429 is how they tell you that you exceeded one. The classic way to hit them is an &lt;code&gt;Apply to each&lt;/code&gt; that calls an action on every item of a list that grew from 50 items to 5,000 — especially once someone has turned concurrency up to make it faster.&lt;/p&gt;

&lt;p&gt;Three levers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Concurrency control.&lt;/strong&gt; On the &lt;code&gt;Apply to each&lt;/code&gt; → Settings → Concurrency Control. By default the loop runs its iterations one at a time; if concurrency has been turned on to speed it up (the degree of parallelism can go from 1 to 50), the loop can fire a burst of simultaneous calls at SharePoint or Outlook. In that case, lowering the degree of parallelism (or setting it to 1 for strict sequencing) is usually the fastest way to stop a 429 storm. The trade-off is runtime — which brings us to lever 2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fewer calls.&lt;/strong&gt; The best API call is the one you don't make. Filter at the source with an OData &lt;strong&gt;Filter Query&lt;/strong&gt; so the loop only receives rows that need processing, and use batch actions where the connector offers them instead of one call per row.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Retry policy with exponential backoff.&lt;/strong&gt; For the 429s that still get through, configure the action's retry policy (action → Settings → Retry Policy). Example values — tune them to the service you're calling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exponential"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PT10S"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maximumInterval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PT1H"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"minimumInterval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PT10S"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exponential means the wait grows between attempts instead of staying fixed, which is exactly what a throttling service wants from you. Power Automate's default policy is already exponential, but its shape — notably the number of retries — depends on the flow's performance profile, so it isn't tuned to any particular service's rate limit; an explicit policy lets you choose the retry count and the minimum and maximum waits yourself. If a 429 response includes a &lt;code&gt;Retry-After&lt;/code&gt; header, honor it: it tells you how long to wait before trying again (usually a number of seconds). The built-in HTTP action can use that header to space its retries (this is documented for the HTTP action in Azure Logic Apps, the engine cloud flows run on); for other actions, don't assume it — make sure your configured intervals aren't shorter than the delay the service asks for.&lt;/p&gt;

&lt;p&gt;I go deeper on throttling causes and the delay-inside-loops technique in the &lt;a href="https://www.powerblocks.dev/guides/power-automate-429-too-many-requests" rel="noopener noreferrer"&gt;429 Too Many Requests guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  404 and 500: different bugs, different fixes
&lt;/h2&gt;

&lt;p&gt;These two get lumped together because they're both "the action failed", but they point in opposite directions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;404 = your reference is wrong.&lt;/strong&gt; The record was deleted, the path points at the wrong site/environment, or a dynamic ID resolved to blank. Guard against it &lt;em&gt;before&lt;/em&gt; the action instead of catching it after:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Condition before the "Get item" action
@not(empty(triggerBody()?['ItemId']))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An empty value in a URL path often ends in a 404. One &lt;code&gt;empty()&lt;/code&gt; check upstream is cheaper than any error handler. (&lt;code&gt;empty()&lt;/code&gt; accepts strings, arrays and objects; if your ID arrives as a number, compare it with null instead: &lt;code&gt;@not(equals(triggerBody()?['ItemId'], null))&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;500 = the service failed while handling your request.&lt;/strong&gt; It is often a transient service-side incident — but some services also answer 500 to input they can't handle, such as a malformed JSON body or a null where a value was required. The fix is to read the raw outputs for the underlying message, validate your request body property by property, and — because some 500s really are transient — put a retry policy on the action. Retrying a 404 is pointless (the record won't materialize); retrying a 500 is often exactly right.&lt;/p&gt;

&lt;p&gt;Full diagnosis walkthrough for both codes: &lt;a href="https://www.powerblocks.dev/guides/power-automate-404-500-errors" rel="noopener noreferrer"&gt;Power Automate 404 and 500 errors&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try/catch with Configure Run After
&lt;/h2&gt;

&lt;p&gt;Power Automate has no &lt;code&gt;try/catch&lt;/code&gt; keyword, but it has the mechanism: &lt;strong&gt;scopes + Configure run after&lt;/strong&gt;. This is the skeleton worth putting in every non-trivial flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scope: Try
  ├─ (all the real work)
Scope: Catch          ← Run after: "has failed", "has timed out"
  ├─ Compose: error details
  ├─ Post message / send mail to the team
Scope: Finally        ← Run after: succeeded, failed, skipped, timed out (all checked)
  ├─ (cleanup / logging that must always run)
Condition: Try didn't succeed        ← optional, top level of the flow, see below
  └─ Terminate: Failed, with a custom message
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set it up by adding the &lt;code&gt;Catch&lt;/code&gt; scope after &lt;code&gt;Try&lt;/code&gt;, then opening its &lt;strong&gt;Run after&lt;/strong&gt; setting (new designer: select the scope, then Settings → Run after; classic designer: the three dots → &lt;strong&gt;Configure run after&lt;/strong&gt;). Uncheck &lt;em&gt;is successful&lt;/em&gt; and check &lt;em&gt;has failed&lt;/em&gt; and &lt;em&gt;has timed out&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Inside the Catch, pull the actual failure details rather than a generic "flow failed" message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Compose action — name, status, inputs and outputs of the Try scope's top-level actions
@result('Try')

// Filter array action — keep everything that neither succeeded nor was skipped
From:      @result('Try')
Condition: @and(not(equals(item()?['status'], 'Succeeded')), not(equals(item()?['status'], 'Skipped')))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;result('Try')&lt;/code&gt; returns the name, status, inputs, outputs, timestamps and tracking IDs of the first-level actions of the scope. It does not drill into deeper nested actions (for example inside a Condition or a Switch). For a top-level action, that is enough to build a notification that says &lt;em&gt;what&lt;/em&gt; failed and &lt;em&gt;why&lt;/em&gt; (the service's error message is in the action's outputs), not just &lt;em&gt;that&lt;/em&gt; something failed. If the failing call sits inside a loop or another nested container, the entry you get is the container itself: call &lt;code&gt;result()&lt;/code&gt; on that loop's own name (as in Microsoft's &lt;code&gt;result('For_each')&lt;/code&gt; example), or keep the actions you want to report on at the top level of the Try scope.&lt;/p&gt;

&lt;p&gt;Filtering is done with the &lt;strong&gt;Filter array&lt;/strong&gt; action; there is no &lt;code&gt;filter()&lt;/code&gt; expression function. The condition above deliberately keeps "anything that isn't Succeeded or Skipped" rather than matching one exact string: Microsoft's documentation describes an action stopped by its timeout under more than one status, so this catches Failed, TimedOut and Cancelled alike. A flow that fails loudly with context gets fixed the same day; a flow that fails silently gets discovered a week later by the business.&lt;/p&gt;

&lt;p&gt;One subtlety: if the Catch scope runs and handles the failure, the run is marked &lt;strong&gt;Succeeded&lt;/strong&gt;. A run is only marked Failed when a failure isn't handled by a subsequent action. If you'd rather handled errors still show up as failed runs (so they're visible in monitoring), use a &lt;code&gt;Terminate&lt;/code&gt; action set to &lt;em&gt;Failed&lt;/em&gt; with a custom error message. Keep in mind that Terminate stops the run and skips every remaining action, so don't end the Catch with it if a Finally scope still has to run: put it after the Finally scope, inside a Condition that checks whether Try succeeded, for example &lt;code&gt;@not(equals(actions('Try')?['status'], 'Succeeded'))&lt;/code&gt;. Keep that Condition + Terminate at the top level of the flow: Terminate is documented as unusable inside &lt;code&gt;Foreach&lt;/code&gt; and &lt;code&gt;Until&lt;/code&gt; loops (documented for Azure Logic Apps — check that your designer accepts it before nesting it), so don't put it inside an &lt;code&gt;Apply to each&lt;/code&gt;. If you'd rather the flow report success once the error is handled, skip the Terminate. Decide deliberately — the default surprises people.&lt;/p&gt;

&lt;h2&gt;
  
  
  401 / "connection expired": the slow-motion failure
&lt;/h2&gt;

&lt;p&gt;This one deserves its own section because it doesn't fail on day one — it fails months later, after nothing changed in the flow.&lt;/p&gt;

&lt;p&gt;Every connector action runs through a stored &lt;strong&gt;connection&lt;/strong&gt; — a saved credential for that connector. When that credential expires, the account password changes, or consent is revoked, every action using that connection typically starts failing with an authentication error, most often a 401. The immediate fix is Power Automate → &lt;strong&gt;Connections&lt;/strong&gt; → find the one showing an error → &lt;strong&gt;Fix connection&lt;/strong&gt; and re-authenticate.&lt;/p&gt;

&lt;p&gt;The real fix is structural:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Critical production flows shouldn't depend on the account of whoever built them.&lt;/strong&gt; Run them under a dedicated identity: preferably a service principal (Microsoft's recommendation for critical or long-running flows; it is an unlicensed application user, so premium flows it owns need a Process or per-flow license), or otherwise a dedicated service account whose credentials aren't shared between people (Microsoft's FAQ advises against service accounts with shared credentials). Otherwise the flow breaks the day that person changes their password or leaves the company.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check connection references when deploying through solutions.&lt;/strong&gt; When you import a solution, you pick a connection for each connection reference. Without usable connections, the imported flow stays turned off, and if the importer picks their own connections, the flow runs under that account. Connection references are part of the deployment, not an afterthought.&lt;/li&gt;
&lt;li&gt;After fixing a connection, open the flow, check that its actions show a healthy connection, and re-test it. If a trigger still doesn't fire, Microsoft's troubleshooting guide suggests making a small edit to the flow, saving it, reverting the edit and saving again so the trigger is registered again; other options are turning the flow off and on, or removing and re-adding the trigger.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I keep the checklist (including the password-policy angle for service accounts) in the &lt;a href="https://www.powerblocks.dev/guides/power-automate-connection-expired" rel="noopener noreferrer"&gt;connection expired guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Timeouts
&lt;/h2&gt;

&lt;p&gt;Two distinct animals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action timeouts&lt;/strong&gt; — a downstream call takes too long. On actions that support it (HTTP, connector and webhook actions, for example), you can set an explicit timeout (action → Settings → Action Timeout — labelled just Timeout in some designers — ISO 8601 duration such as &lt;code&gt;PT5M&lt;/code&gt;) and combine it with the retry policy. Microsoft describes it as the maximum duration between retries and asynchronous responses for that action; it doesn't change the request timeout of a single request, so it doesn't extend the 2-minute limit on a single synchronous request. Your Catch scope should include &lt;em&gt;has timed out&lt;/em&gt; in its run-after conditions — it's easy to configure only &lt;em&gt;has failed&lt;/em&gt; and let timeouts slip past your error handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flow-level limits&lt;/strong&gt; — a cloud flow run can last up to 30 days, but a single synchronous HTTP request times out after 120 seconds (2 minutes); only asynchronous operations can be configured to wait longer. If a single action routinely brushes its timeout, the fix is architectural (webhooks / polling pattern), not a bigger timeout number.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The checklist
&lt;/h2&gt;

&lt;p&gt;For every production flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Retry policy&lt;/strong&gt; (exponential) on actions that call an external service, where the action supports one and repeating the call is safe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency control&lt;/strong&gt; tuned on every &lt;code&gt;Apply to each&lt;/code&gt; that makes API calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guard conditions&lt;/strong&gt; before actions that take dynamic IDs (&lt;code&gt;empty()&lt;/code&gt; checks).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try/Catch scopes&lt;/strong&gt; with run-after configured for &lt;em&gt;failed&lt;/em&gt; and &lt;em&gt;timed out&lt;/em&gt;, and a notification that includes &lt;code&gt;result('Try')&lt;/code&gt; details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A dedicated owner identity&lt;/strong&gt; (preferably a service principal, otherwise a non-shared service account) and verified connection references before it ships.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this is glamorous, and all of it is the difference between automation people trust and automation people quietly work around.&lt;/p&gt;

&lt;p&gt;Most of these guides live in the troubleshooting section of &lt;a href="https://www.powerblocks.dev" rel="noopener noreferrer"&gt;PowerBlocks&lt;/a&gt;, the Power Apps YAML component library I maintain — the flow-error write-ups are free, no login.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your Catch scope's notification channel — Teams, email, or a log table? And has anyone actually gotten a clean answer out of a bare 500 without reading raw outputs? Comments below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerautomate</category>
      <category>powerplatform</category>
      <category>lowcode</category>
      <category>automation</category>
    </item>
    <item>
      <title>Delegation in Power Apps, Explained With Real Queries</title>
      <dc:creator>Sofiane Mebchour</dc:creator>
      <pubDate>Wed, 16 Sep 2026 22:03:01 +0000</pubDate>
      <link>https://dev.to/sofianem8/delegation-in-power-apps-explained-with-real-queries-327o</link>
      <guid>https://dev.to/sofianem8/delegation-in-power-apps-explained-with-real-queries-327o</guid>
      <description>&lt;p&gt;If you've built more than two canvas apps, you've seen it: the &lt;strong&gt;blue squiggly underline&lt;/strong&gt; in the formula bar, a yellow warning triangle, and a message about "delegation". Most makers hover it once, shrug, and move on — until a user reports that a record they &lt;em&gt;know&lt;/em&gt; exists doesn't show up in the app.&lt;/p&gt;

&lt;p&gt;That missing record is delegation. It's the single most common source of "the app is losing data" bugs in Power Apps, and it's entirely predictable once you understand what's happening under the hood.&lt;/p&gt;

&lt;h2&gt;
  
  
  What delegation actually is
&lt;/h2&gt;

&lt;p&gt;When your gallery's &lt;code&gt;Items&lt;/code&gt; property says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Filter(Orders, Status = "Open")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;there are two ways Power Apps can evaluate it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Server-side (delegated):&lt;/strong&gt; Power Apps translates your Power Fx into a query the data source understands (OData for SharePoint, FetchXML-ish for Dataverse, SQL for... SQL) and sends it over the wire. The server filters its million rows and returns only the matches. Fast, complete, correct.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Client-side (not delegated):&lt;/strong&gt; Power Apps can't translate part of the formula, so it downloads rows from the source and runs the filter locally on your device.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's the trap: in case 2, Power Apps does &lt;strong&gt;not&lt;/strong&gt; download the whole table. It downloads the first &lt;strong&gt;500 rows&lt;/strong&gt; (the default data row limit, configurable up to 2000) and runs your formula on that subset only.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;Filter(Orders, Status = "Open")&lt;/code&gt; against a 10,000-row SharePoint list with a non-delegable condition doesn't error out. It returns the open orders &lt;em&gt;among the first 500 rows&lt;/em&gt; — and silently ignores the other 9,500. No error message. No empty gallery. Just quietly wrong results.&lt;/p&gt;

&lt;p&gt;That's what the blue underline is warning you about. It's not a style suggestion. It's "your query will return incomplete data on large tables."&lt;/p&gt;

&lt;h2&gt;
  
  
  The 500/2000 limit
&lt;/h2&gt;

&lt;p&gt;The cap for non-delegable queries lives in &lt;strong&gt;Settings &amp;gt; General &amp;gt; "Data row limit for non-delegable queries"&lt;/strong&gt;. Default is 500, maximum is 2000.&lt;/p&gt;

&lt;p&gt;Raising it to 2000 is a legitimate move when your table genuinely stays small — a reference list of 800 categories, say. But treat it as what it is: a stopgap. At row 2001 the bug comes back, and pulling 2000 rows on every screen load hurts performance on mobile. I wrote up the setting and its trade-offs in more detail in &lt;a href="https://www.powerblocks.dev/guides/increase-data-row-limit" rel="noopener noreferrer"&gt;this guide on the data row limit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The durable fix is always the same: make the query delegable so the cap never applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delegation depends on the data source
&lt;/h2&gt;

&lt;p&gt;This is the part most tutorials skip: &lt;strong&gt;delegability is per connector, per function, per operator&lt;/strong&gt;. The same formula can be fully delegable against Dataverse and non-delegable against SharePoint.&lt;/p&gt;

&lt;p&gt;Rough hierarchy, from most to least delegation support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dataverse&lt;/strong&gt; — the widest support: &lt;code&gt;Filter&lt;/code&gt;, &lt;code&gt;Sort&lt;/code&gt;, &lt;code&gt;LookUp&lt;/code&gt;, comparison operators, &lt;code&gt;StartsWith&lt;/code&gt;, &lt;code&gt;And/Or/Not&lt;/code&gt;, aggregates like &lt;code&gt;Sum&lt;/code&gt;/&lt;code&gt;CountRows&lt;/code&gt; in many cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQL Server&lt;/strong&gt; — very good: most comparisons, &lt;code&gt;StartsWith&lt;/code&gt;, sorting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SharePoint&lt;/strong&gt; — noticeably narrower: &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;StartsWith&lt;/code&gt; are fine, but &lt;strong&gt;&lt;code&gt;Search&lt;/code&gt;, &lt;code&gt;in&lt;/code&gt; on text, &lt;code&gt;IsBlank&lt;/code&gt; in filters, and sorting by complex column types are not delegable&lt;/strong&gt;. Choice and lookup columns have extra quirks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excel / imported static data&lt;/strong&gt; — essentially nothing delegates. Fine for lookup tables under 500 rows, dangerous for anything else.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practical consequence: if you're choosing a backend for a table that will grow past a couple thousand rows and you're on SharePoint "because it's free", delegation is the tax you'll pay. It's manageable — but only if you write your formulas around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real queries that break, and their delegable rewrites
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Search vs StartsWith
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ Not delegable on SharePoint
Filter(Orders, Search(CustomerName, txtSearch.Text) &amp;gt; 0)

// ❌ Also not delegable on SharePoint (the "in" operator on text)
Filter(Orders, txtSearch.Text in CustomerName)

// ✅ Delegable
Filter(Orders, StartsWith(CustomerName, txtSearch.Text))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, &lt;code&gt;StartsWith&lt;/code&gt; only matches from the beginning of the string. For a search box, that's usually acceptable — and it's infinitely better than a "contains" search that only searches the first 500 rows.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Functions inside the filter condition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ Not delegable — the source can't evaluate Text() or Year()
Filter(Orders, Text(OrderDate, "yyyy") = "2026")

// ✅ Delegable — compare against plain values the server understands
Filter(Orders, OrderDate &amp;gt;= Date(2026, 1, 1), OrderDate &amp;lt; Date(2027, 1, 1))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rule of thumb: &lt;strong&gt;the column stays naked on the left side&lt;/strong&gt;. The moment you wrap the column in a function (&lt;code&gt;Text()&lt;/code&gt;, &lt;code&gt;Lower()&lt;/code&gt;, &lt;code&gt;Year()&lt;/code&gt;, arithmetic), the server can't translate it and evaluation falls back to the client.&lt;/p&gt;

&lt;p&gt;Same idea with computed values — pre-compute them into a variable &lt;em&gt;before&lt;/em&gt; the query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ Function call evaluated per-row inside the filter
Filter(Tasks, DueDate &amp;lt; DateAdd(Today(), 7, TimeUnit.Days))

// ✅ Compute once, filter on the plain value
Set(varWeekOut, DateAdd(Today(), 7, TimeUnit.Days));
Filter(Tasks, DueDate &amp;lt; varWeekOut)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Whether the first version delegates varies by connector — the second version removes the doubt everywhere.)&lt;/p&gt;

&lt;h3&gt;
  
  
  3. LookUp on a non-delegable condition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ IsBlank inside a filter is not delegable on SharePoint
LookUp(Orders, IsBlank(ClosedDate))

// ✅ Compare to Blank() directly (delegable on most sources)
LookUp(Orders, ClosedDate = Blank())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Filter server-side first, then do the fancy stuff locally
&lt;/h3&gt;

&lt;p&gt;You don't have to make &lt;em&gt;everything&lt;/em&gt; delegable — you have to make the part that touches the big table delegable. Once the result set is small, client-side evaluation is harmless:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Delegable date-range filter reduces 50,000 rows to ~200,
// then the non-delegable sort runs safely on the small result
SortByColumns(
    Filter(Orders, OrderDate &amp;gt;= varMonthStart, OrderDate &amp;lt; varMonthEnd),
    "CustomerName",
    SortOrder.Ascending
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This "narrow on the server, refine on the client" pattern solves 80% of real-world delegation problems without any exotic workaround.&lt;/p&gt;

&lt;h2&gt;
  
  
  The collections workaround (and its caveats)
&lt;/h2&gt;

&lt;p&gt;The classic hack for "I need all 8,000 rows locally" is chunked &lt;code&gt;ClearCollect&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ClearCollect(colAll, Filter(Orders, ID &amp;gt;= 1, ID &amp;lt;= 2000));
Collect(colAll, Filter(Orders, ID &amp;gt;= 2001, ID &amp;lt;= 4000));
Collect(colAll, Filter(Orders, ID &amp;gt;= 4001, ID &amp;lt;= 6000));
Collect(colAll, Filter(Orders, ID &amp;gt;= 6001, ID &amp;lt;= 8000));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each chunk is a delegable query under the row limit, so you end up with the full table in a collection. It works. I've used it. And you should know exactly what you're signing up for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's a snapshot.&lt;/strong&gt; The collection is stale the moment it's built; edits by other users won't appear until you re-collect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load time and memory.&lt;/strong&gt; Thousands of rows over the wire on app start, on every device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The ID ranges are a maintenance trap.&lt;/strong&gt; Gaps are fine, but growth isn't — at row 8,001 you're silently dropping data again, which is the exact bug you were trying to fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It caps out.&lt;/strong&gt; Somewhere in the tens of thousands of rows this stops being viable at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use it for genuinely bounded, read-mostly datasets (a product catalog, a location list). For anything that grows unbounded, fix the query instead — or move the table to Dataverse where the query can delegate.&lt;/p&gt;

&lt;h2&gt;
  
  
  A workflow that keeps you honest
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Never ignore the blue underline.&lt;/strong&gt; Hover it — Studio tells you &lt;em&gt;which part&lt;/em&gt; of the formula is non-delegable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test with realistic volume.&lt;/strong&gt; Delegation bugs are invisible with 50 test rows. Load 1,000+ rows before you trust a screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know your connector's delegable list.&lt;/strong&gt; Check Microsoft's per-connector documentation when in doubt — SharePoint's list is short enough to memorize.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the column bare on the left side&lt;/strong&gt; of every comparison inside &lt;code&gt;Filter&lt;/code&gt;/&lt;code&gt;LookUp&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I keep a fuller checklist of fixes in the &lt;a href="https://www.powerblocks.dev/guides/fix-delegation-warning" rel="noopener noreferrer"&gt;delegation warning guide&lt;/a&gt; — it's the write-up I send to teammates when the blue underline shows up in a code review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;Delegation isn't a Power Apps quirk to memorize around — it's the fundamental question of &lt;em&gt;where your query runs&lt;/em&gt;. Server-side means complete and fast; client-side means the first 500-2000 rows and a silent data bug. Write filters the server can translate, narrow before you refine, and treat the row limit setting as a last resort.&lt;/p&gt;

&lt;p&gt;For quick syntax reference while rewriting formulas (including the delegable-friendly patterns above, in both EN and FR locale syntax), I maintain a free &lt;a href="https://www.powerblocks.dev/tools/expressions" rel="noopener noreferrer"&gt;Power Fx expression cheatsheet&lt;/a&gt; as part of PowerBlocks, my Power Apps component library — no login needed.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's the nastiest delegation bug you've shipped to production? Share yours in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>powerplatform</category>
      <category>lowcode</category>
      <category>dataverse</category>
    </item>
    <item>
      <title>The Power Fx Formulas You Actually Use Every Day (With French Locale Gotchas)</title>
      <dc:creator>Sofiane Mebchour</dc:creator>
      <pubDate>Mon, 14 Sep 2026 13:23:52 +0000</pubDate>
      <link>https://dev.to/sofianem8/the-30-power-apps-formulas-you-actually-use-with-french-locale-gotchas-i78</link>
      <guid>https://dev.to/sofianem8/the-30-power-apps-formulas-you-actually-use-with-french-locale-gotchas-i78</guid>
      <description>&lt;p&gt;Every Power Apps maker ends up googling the same formulas over and over. This is the cheatsheet I wish I had — organized by what you're actually trying to do, not alphabetically: filtering galleries, validating forms, saving data with Patch, dates, state, and (the part most tutorials skip) the French locale traps that silently break copy-pasted formulas.&lt;/p&gt;

&lt;p&gt;And because half my projects run in French environments: the &lt;strong&gt;locale gotchas&lt;/strong&gt; that silently break copy-pasted formulas, which almost no English tutorial mentions.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Filtering a gallery (the big one)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Basic filter
Filter(Orders, Status = "Open")

// Search-as-you-type (delegable)
Filter(Orders, StartsWith(CustomerName, SearchInput.Text))

// Combine search + dropdown filter
Filter(Orders,
  StartsWith(CustomerName, SearchInput.Text),
  ddStatus.Selected.Value = "All" || Status = ddStatus.Selected.Value
)

// Sort the result
SortByColumns(Filter(Orders, Status = "Open"), "OrderDate", SortOrder.Descending)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delegation tip: prefer &lt;code&gt;StartsWith()&lt;/code&gt; over &lt;code&gt;Search()&lt;/code&gt; and &lt;code&gt;in&lt;/code&gt; on large sources — non-delegable functions silently cap your results at 500-2000 rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Validating a form
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Required field + email shape
If(
  IsBlank(txtEmail.Text) || !IsMatch(txtEmail.Text, Match.Email),
  Notify("Please enter a valid email", NotificationType.Error),
  SubmitForm(EditForm1)
)

// Disable the submit button until valid
DisplayMode: If(
  !IsBlank(txtName.Text) &amp;amp;&amp;amp; IsMatch(txtEmail.Text, Match.Email),
  DisplayMode.Edit,
  DisplayMode.Disabled
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key functions: &lt;code&gt;IsBlank()&lt;/code&gt;, &lt;code&gt;IsMatch()&lt;/code&gt;, &lt;code&gt;IsError()&lt;/code&gt;, &lt;code&gt;Coalesce()&lt;/code&gt; (first non-blank value).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Saving data with Patch
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Create a record
Patch(Orders, Defaults(Orders), {
  Title: txtTitle.Text,
  Quantity: Value(txtQty.Text),
  DueDate: dpDue.SelectedDate
})

// Update the selected gallery item
Patch(Orders, galOrders.Selected, { Status: "Closed" })

// Create or update in one formula (upsert)
Patch(Orders,
  Coalesce(LookUp(Orders, ID = varID), Defaults(Orders)),
  { Title: txtTitle.Text }
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The #1 Patch trap: type mismatches. &lt;code&gt;Value()&lt;/code&gt;, &lt;code&gt;Text()&lt;/code&gt;, &lt;code&gt;DateValue()&lt;/code&gt; are your friends — a text input is always text, even if it looks like a number.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Dates without tears
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Today()                              // date only
Now()                                // date + time
Text(Today(), "dd/mm/yyyy")          // format for display
DateAdd(Today(), -30, TimeUnit.Days) // 30 days ago
DateDiff(StartDate, EndDate, TimeUnit.Days)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Variables and collections
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set(varUser, User().Email)                   // global variable
UpdateContext({locShowModal: true})          // screen variable
ClearCollect(colItems, Filter(Orders, ...))  // snapshot a query
With({t: Filter(Orders, Status="Open")},     // scoped, no variable at all
  CountRows(t) &amp;amp; " open / " &amp;amp; Sum(t, Amount) &amp;amp; " €"
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;With()&lt;/code&gt; is the most underused function in Power Apps — it replaces most "temporary variable" needs and keeps formulas readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The French locale gotchas 🇫🇷
&lt;/h2&gt;

&lt;p&gt;If your formula works in a US tenant and throws syntax errors in a French one, here's why:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Argument separators change.&lt;/strong&gt; In &lt;code&gt;fr-FR&lt;/code&gt;, Power Fx uses &lt;code&gt;;&lt;/code&gt; between arguments (because &lt;code&gt;,&lt;/code&gt; is the decimal separator):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// en-US
Filter(Orders, Status = "Open", Amount &amp;gt; 100)

// fr-FR — same formula
Filter(Orders; Status = "Open"; Amount &amp;gt; 100)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Chained statements use &lt;code&gt;;;&lt;/code&gt;&lt;/strong&gt; in French where English uses &lt;code&gt;;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// en-US:  Set(x, 1); Notify("done")
// fr-FR:  Set(x; 1);; Notify("terminé")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Decimals flip too&lt;/strong&gt;: &lt;code&gt;0.5&lt;/code&gt; (EN) becomes &lt;code&gt;0,5&lt;/code&gt; (FR) inside formulas.&lt;/p&gt;

&lt;p&gt;So a YAML snippet or blog formula written for EN will not paste cleanly into an FR-locale Studio session. Either convert the separators, or keep two variants of your snippets. (I wrote a small &lt;a href="https://www.powerblocks.dev/tools/expressions" rel="noopener noreferrer"&gt;converter as part of PowerBlocks&lt;/a&gt; — the cheatsheet tool shows every formula in both EN and FR syntax, and it's free.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The full searchable list
&lt;/h2&gt;

&lt;p&gt;This article covers the formulas I use daily, but the full reference — 80+ functions with EN/FR examples, searchable and filterable by category, one-click copy — lives here: &lt;a href="https://www.powerblocks.dev/tools/expressions" rel="noopener noreferrer"&gt;Expression Cheatsheet on PowerBlocks&lt;/a&gt; (free, no login). There's a &lt;a href="https://www.powerblocks.dev/tools/power-automate" rel="noopener noreferrer"&gt;Power Automate equivalent&lt;/a&gt; too.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's the formula you always have to look up? Drop it in the comments — I'll add the most requested ones to the cheatsheet.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>powerplatform</category>
      <category>lowcode</category>
      <category>powerfx</category>
    </item>
    <item>
      <title>Power Apps YAML Components: Build Canvas App UIs by Copy-Pasting Code</title>
      <dc:creator>Sofiane Mebchour</dc:creator>
      <pubDate>Sun, 05 Jul 2026 07:49:46 +0000</pubDate>
      <link>https://dev.to/sofianem8/power-apps-yaml-components-build-canvas-app-uis-by-copy-pasting-code-m57</link>
      <guid>https://dev.to/sofianem8/power-apps-yaml-components-build-canvas-app-uis-by-copy-pasting-code-m57</guid>
      <description>&lt;p&gt;If you build canvas apps in Power Apps, you've probably rebuilt the same modal, search bar, or navigation header a dozen times by hand. There's a better way: since Microsoft introduced YAML support in Power Apps Studio, &lt;strong&gt;entire UI components can be copied and pasted as plain text&lt;/strong&gt; — controls, layout, formulas and all.&lt;/p&gt;

&lt;p&gt;This changes how you can work: components become shareable snippets, reviewable in Git, and reusable across every app and tenant.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Power Apps YAML?
&lt;/h2&gt;

&lt;p&gt;Power Apps Studio serializes canvas controls in a YAML-based format (the same format used by &lt;a href="https://learn.microsoft.com/en-us/power-platform/power-fx/yaml-formula-grammar" rel="noopener noreferrer"&gt;Power Apps Source Code files&lt;/a&gt;, &lt;code&gt;.pa.yaml&lt;/code&gt;). When you copy a control in the Studio tree view, what lands in your clipboard is YAML. The reverse works too: paste valid YAML into the tree view, and Studio recreates the whole control hierarchy.&lt;/p&gt;

&lt;p&gt;A minimal example — a styled button:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;PrimaryButton&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Control&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Classic/Button&lt;/span&gt;
    &lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Text&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;="Save changes"&lt;/span&gt;
      &lt;span class="na"&gt;Fill&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;=RGBA(59, 130, 246, 1)&lt;/span&gt;
      &lt;span class="na"&gt;Color&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;=RGBA(255, 255, 255, 1)&lt;/span&gt;
      &lt;span class="na"&gt;Height&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;=40&lt;/span&gt;
      &lt;span class="na"&gt;Width&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;=160&lt;/span&gt;
      &lt;span class="na"&gt;BorderRadius&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;=8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste that into any screen's tree view (Ctrl+V) and you get a working button. Now imagine the same thing for a complete confirmation modal, a data table, or an entire screen layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you paste a YAML component into Power Apps?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Copy the YAML snippet (from a file, a repo, or a component library).&lt;/li&gt;
&lt;li&gt;In Power Apps Studio, open the &lt;strong&gt;Tree view&lt;/strong&gt; and select the screen (or container) where the component should go.&lt;/li&gt;
&lt;li&gt;Paste with &lt;strong&gt;Ctrl+V&lt;/strong&gt; (Cmd+V on Mac).&lt;/li&gt;
&lt;li&gt;Studio instantiates the controls. If a control version differs from your environment, let Studio auto-upgrade it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it — no import wizard, no solution packaging, no component library setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common pitfalls (and how to avoid them)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;French/localized environments use semicolons.&lt;/strong&gt; Power Fx separates function arguments with &lt;code&gt;,&lt;/code&gt; in English locales but &lt;code&gt;;&lt;/code&gt; in French and several other European locales. YAML written for an EN environment will throw formula errors in an FR environment. Fix: keep two variants of your snippets, or convert separators before pasting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native control versions differ per environment.&lt;/strong&gt; Wrappers around native controls (date pickers, combo boxes) reference a control version like &lt;code&gt;GroupContainer@1.3.0&lt;/code&gt;. If your environment runs a different version, accept Studio's auto-upgrade prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Names must be unique per screen.&lt;/strong&gt; Pasting the same component twice auto-renames controls (&lt;code&gt;Button1_1&lt;/code&gt;), which can break formulas referencing them by name. Prefer components whose internal references are relative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not everything serializes.&lt;/strong&gt; Data source connections and some component-library references don't travel through the clipboard — YAML components work best as pure UI + Power Fx logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to find ready-made YAML components
&lt;/h2&gt;

&lt;p&gt;You can build your own snippet library in a Git repo — that alone is a big win for teams. If you want a head start, &lt;a href="https://www.powerblocks.dev" rel="noopener noreferrer"&gt;PowerBlocks&lt;/a&gt; is a curated library of copy-paste ready Power Apps YAML components (modals, forms, navigation, tables, cards), each with EN/FR locale variants and usage instructions. The &lt;a href="https://www.powerblocks.dev/library" rel="noopener noreferrer"&gt;component library&lt;/a&gt; includes free components, and the site also ships free developer tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an &lt;a href="https://www.powerblocks.dev/tools/expressions" rel="noopener noreferrer"&gt;Expression Cheatsheet&lt;/a&gt; covering Power Apps functions with EN/FR examples,&lt;/li&gt;
&lt;li&gt;an &lt;a href="https://www.powerblocks.dev/tools/color-picker" rel="noopener noreferrer"&gt;RGBA Color Picker&lt;/a&gt; that outputs ready-to-use &lt;code&gt;RGBA()&lt;/code&gt; formulas,&lt;/li&gt;
&lt;li&gt;an &lt;a href="https://www.powerblocks.dev/tools/icon-library" rel="noopener noreferrer"&gt;Icon Library&lt;/a&gt; with copy-ready &lt;code&gt;Icon.Name&lt;/code&gt; expressions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this matters for Power Platform teams
&lt;/h2&gt;

&lt;p&gt;Copy-paste YAML turns canvas app UI into &lt;strong&gt;code you can govern&lt;/strong&gt;: store components in a repo, review changes in pull requests, enforce a design system through shared snippets, and onboard new makers with a paste instead of a tutorial. For solution architects, it's the missing link between low-code speed and pro-code discipline.&lt;/p&gt;

&lt;p&gt;If you've been maintaining screenshots-and-instructions documentation for your team's UI patterns, replace it with a folder of &lt;code&gt;.pa.yaml&lt;/code&gt; files — your future self will thank you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Do you already version your canvas app components as YAML? I'd love to hear how your team handles reuse across environments — drop a comment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>powerplatform</category>
      <category>lowcode</category>
      <category>yamlcomma</category>
    </item>
  </channel>
</rss>
