{"id":16951,"date":"2021-10-20T21:08:43","date_gmt":"2021-10-21T04:08:43","guid":{"rendered":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/power-apps\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/"},"modified":"2025-06-11T07:52:11","modified_gmt":"2025-06-11T14:52:11","slug":"app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart","status":"publish","type":"post","link":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/power-apps\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/","title":{"rendered":"App.StartScreen: a new declarative alternative to Navigate in App.OnStart"},"content":{"rendered":"<p><strong>Note: If you are here because you have an app that was created before March 2021, that is now showing an error for using Navigate in OnStart, skip ahead to the section on Older apps with new Navigate workaround.\u00a0 It is an uncommon situation and there is a simple fix.\u00a0\u00a0<\/strong><\/p>\n<p>Everyone loves <a href=\"https:\/\/docs.microsoft.com\/en-us\/powerapps\/maker\/canvas-apps\/functions\/object-app#onstart-property\">App.OnStart<\/a>.\u00a0 It is widely used for the initialization of global variables, the prefetching of data into collections, and to determine which screen should be shown first.\u00a0 \u00a0It has been widely successful and we promote its use heavily in our performance optimization guidance.<\/p>\n<p>But there&#8217;s a problem with this wonderful property.\u00a0 It is <a href=\"https:\/\/en.wikipedia.org\/wiki\/Imperative_programming\">imperative<\/a>.\u00a0 It is an ordered list of work that needs to be done before the first screen is shown.\u00a0 Because it is so specific about not only <em>what<\/em> needs to be done, but also <em>when<\/em>\u00a0that work must be done based on order, it limits the reordering and deferring optimizations that could otherwise be done.<\/p>\n<p>The situation became acute with our Microsoft Teams integration.\u00a0 \u00a0Having quick app load times is always important, but for Teams it is critical &#8211; apps don&#8217;t stay in memory, they are expected to load and close within a few seconds at most.\u00a0 Analysis found that App.OnStart was a major culprit for slow loading apps in teams, and since it is imperative, there isn&#8217;t very much the system could do to improve the performance.<\/p>\n<p>So, today, we are all embarking on a journey.\u00a0 Over the course of many months we are going to provide new <a href=\"https:\/\/en.wikipedia.org\/wiki\/Declarative_programming\">declarative<\/a> alternatives for all the things you do in App.OnStart today.\u00a0 Not only will your apps load faster and give a better user experience, but it will be easier to write and debug them too.\u00a0 Declarative means that you continue to tell us <em>what<\/em> you want to happen, but you don&#8217;t need to tell us <em>when<\/em> or <em>how<\/em>.\u00a0 For example, an Excel spreadsheet describes a set of dependencies between cells (<em>what<\/em>), it doesn&#8217;t say when they should be recalculated or in what order (<em>when<\/em> and <em>how<\/em>), that is Excel&#8217;s job.\u00a0 Going declarative relieves a lot of the tedium of keeping state variables up to date.<\/p>\n<p>To be clear, we have no plans to eliminate App.OnStart.\u00a0 There will likely always be a few outlier reasons to use it, but we do expect that it will become the exception rather than the rule.\u00a0 That&#8217;s a big shift from today.\u00a0 And that won&#8217;t happen overnight as we need, together, to determine the best declarative alternatives.\u00a0\u00a0Your engagement and feedback is the only way this will work.<\/p>\n<p>We are not forcing you to change anything today.\u00a0 Your apps will continue running App.OnStart as they always have.\u00a0 \u00a0I&#8217;m just unrolling the roadmap out on the table and pointing out our first milestone: <a href=\"https:\/\/docs.microsoft.com\/en-us\/powerapps\/maker\/canvas-apps\/functions\/object-app#startscreen-property\">App.StartScreen<\/a>.<\/p>\n<h2>App.StartScreen<\/h2>\n<p>By default, the first screen shown when an app starts is the first is in the Tree View in Studio.\u00a0 That behavior can be modified today by calling the Navigate function from within App.OnStart.<\/p>\n<p>This poses a performance problem.\u00a0 If App.OnStart contains a Navigate function call, even if it is in an If function and rarely called, we must complete execution of the App.OnStart before we show the first screen of the app.\u00a0 Ideally we would show the first screen as soon as its dependencies are satisfied, but defer work that are only required by other screens of the app.<\/p>\n<p>App.StartScreen is the new declarative way to indicate which screen should be shown first, that doesn&#8217;t block optimizations.<\/p>\n<p>Where you may have written this in the past:<\/p>\n<pre>App.OnStart = Collect( OrdersCache, Orders );\n              If( Param( \"AdminMode\" ) = \"1\", Navigate( AdminScreen ), Navigate( HomeScreen ) )<\/pre>\n<p>Instead, you can write this with version 3.21101 and later:<\/p>\n<pre>App.OnStart = Collect( OrdersCache, Orders );\nApp.StartScreen = If( Param( \"AdminMode\" ) = \"1\", AdminScreen, HomeScreen )<\/pre>\n<p>I know, they look very similar, it&#8217;s a nuanced difference.\u00a0 Things to notice:<\/p>\n<ul>\n<li>App.StartScreen is describing a <em>calculation<\/em>, not work to be done<em>.<\/em>\u00a0 No side effects, no Navigate calls, nothing imperative.\u00a0 \u00a0It returns the screen object to show first.\u00a0 It is up to the system to decide when this information is needed and when it is no longer relevant.<\/li>\n<li>App.StartScreen is separated out from App.OnStart in the second case.\u00a0 They are independent and can be evaluated separately.\u00a0 We can show the first screen before App.OnStart is complete.\u00a0 This is huge.\u00a0 Today, if the App.OnStart contains a Navigate call, we can&#8217;t show the first screen until the entire App.OnStart has completed, blocking optimizations that would improve app load time.<\/li>\n<\/ul>\n<p>Check out\u00a0<a href=\"https:\/\/docs.microsoft.com\/en-us\/powerapps\/maker\/canvas-apps\/functions\/object-app#startscreen-property\">the documentation<\/a> for more details.<\/p>\n<p>If you put your existing knowledge of Navigate in App.OnStart aside, it is actually very easy to explain.\u00a0 To specify the start screen for an app, provide the screen name in the App.StartScreen property:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" class=\"alignnone size-full wp-image-17032\" height=\"315\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.png\" width=\"681\" srcset=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.webp 681w, https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12-300x139.webp 300w\" sizes=\"auto, (max-width: 681px) 100vw, 681px\" \/><br \/>\n<strong>Screen2<\/strong> in this case can be replaced by a formula that can take into account the current user, a Param function call, database records, etc.<\/p>\n<p>You can<span style=\"font-size: 1rem;\">\u00a0test that this works by selecting <\/span><strong style=\"font-size: 1rem;\">Navigate to StartScreen<\/strong><span style=\"font-size: 1rem;\"> on the <\/span><strong style=\"font-size: 1rem;\">&#8230;<\/strong><span style=\"font-size: 1rem;\"> menu for App:<\/span><br \/>\n<img loading=\"lazy\" decoding=\"async\" alt=\"\" class=\"alignnone size-full wp-image-17033\" height=\"315\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h40_10.png\" width=\"681\" srcset=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h40_10.webp 681w, https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h40_10-300x139.webp 300w\" sizes=\"auto, (max-width: 681px) 100vw, 681px\" \/><\/p>\n<p>And just like that, we are on Screen2, just as if the app had just started:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" class=\"alignnone size-full wp-image-17034\" height=\"315\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h41_00.png\" width=\"681\" srcset=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h41_00.webp 681w, https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h41_00-300x139.webp 300w\" sizes=\"auto, (max-width: 681px) 100vw, 681px\" \/><\/p>\n<h2>Retiring Navigate in App.OnStart<\/h2>\n<p>By introducing App.StartScreen, we are also going to <em>begin<\/em> the process of retiring the use of Navigate in App.OnStart.<\/p>\n<p>Do not be alarmed!\u00a0 Your apps can keep calling Navigate in App.OnStart.\u00a0\u00a0<span style=\"font-size: 1rem;\">Existing apps should see no change in behavior (with one small exception, noted below, and there is a an easy workaround).\u00a0\u00a0<\/span><\/p>\n<p>There is a new switch in Settings that enables Navigate in App.OnStart.\u00a0 For existing apps, that make use of Navigate in OnStart, this switch will be On.\u00a0 For new apps, this switch will be off by default but can be turned on.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" class=\"alignnone size-full wp-image-17028\" height=\"299\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_16h30_07.png\" width=\"763\" srcset=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_16h30_07.webp 763w, https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_16h30_07-300x118.webp 300w\" sizes=\"auto, (max-width: 763px) 100vw, 763px\" \/><\/p>\n<p>With the switch off, you will see an error in Studio when trying to use Navigate in App.OnStart.\u00a0 With the switch on, the message is only a warning.<\/p>\n<h2>Older app with new Navigate workaround<\/h2>\n<p>Here&#8217;s the exception mentioned before.\u00a0 If you had an existing app created before March 2021, that did not have a Navigate call in App.OnStart, to which you added Navigate to the OnStart between March and now, then the above switch will be turned off and you will see an error the next time you load the app in Studio.\u00a0 Please turn the above switch on to clear the error.\u00a0 We have a fix for this case that will be rolling out soon, but it will be a few weeks until it is fully deployed.<\/p>\n<h2>Retired &#8220;Enhanced formula bar&#8221;<\/h2>\n<p>One more caveat.\u00a0 StartScreen is not compatible with the previously experimental and now <a href=\"https:\/\/powerapps.microsoft.com\/en-us\/blog\/formula-bar-changes\/\">retired Enhanced formula bar<\/a>.\u00a0 The new property won&#8217;t appear in the list of properties for the App.\u00a0 To use StartScreen, it is time to turn off the enhanced formula bar, this <a href=\"https:\/\/powerapps.microsoft.com\/en-us\/blog\/formula-bar-changes\/\">blog post<\/a> has more details.<\/p>\n<h2>Declarative road ahead: Named formulas<\/h2>\n<p>App.StartScreen is just our first step.\u00a0 There are two other important new declarative features in the works.<\/p>\n<p>How many of you use Set in App.OnStart to setup global variables?\u00a0 Ok, everyone raised their hand.\u00a0 What if instead of writing:<\/p>\n<pre>App.Onstart = Set( ThisUser, LookUp( Users, Email = User().Email ) )<\/pre>\n<p>You instead wrote:<\/p>\n<pre>ThisUser = LookUp( Users, Email = User().Email )<\/pre>\n<p>I know, yet another very nuanced difference.\u00a0 \u00a0In the second case, we are defining a <em>named formula\u00a0<\/em>rather than using the Set function.\u00a0 This is equivalent to defining a name in Excel by using the formula bar or the Name Manager.<\/p>\n<p>So, what&#8217;s better about this approach?<\/p>\n<ul>\n<li>Like every formula, the value is always up to date.\u00a0 It recalculates automatically as dependencies change.\u00a0 The ThisUser record is always correct, even if the app modifies the current user&#8217;s entry in the User data source.\u00a0 It need not be updated manually with anther Set call later.<\/li>\n<li>ThisUser is always available.\u00a0 There is no time before the app starts running in which it is uninitialized.\u00a0 It will never have a Blank or Null value (unless it doesn&#8217;t find the user).<\/li>\n<li>The formula can&#8217;t be modified from somewhere else in the app.\u00a0 Between the time the Set is called and it is used, no other formula can modify the value.\u00a0 That&#8217;s great because there is a single source of truth for ThisUser, this formula, nothing else can have an impact on it.<\/li>\n<li>And the performance benefit: Power Fx only needs to evaluate ThisUser when it is used.\u00a0 Work can be deferred, reordered, or even eliminated.\u00a0 If ThisUser isn&#8217;t used by the screens the user visits in a session, then it won&#8217;t be evaluated at all for that session.<\/li>\n<\/ul>\n<p>And if you think that&#8217;s good, imagine combining named formulas with the equivalent of Excel&#8217;s new <a href=\"https:\/\/support.microsoft.com\/en-us\/office\/lambda-function-bd212d27-1cd1-4321-a34a-ccbf254b8b67\">Lambda function.<\/a><\/p>\n<h2>Declarative road ahead: Prefetched and cached data<\/h2>\n<p>How many of you use Collect in App.OnStart to prefetch and cache data from a data source?\u00a0 Ok, once again everyone raised their hand.<\/p>\n<p>What if instead of writing this today:<\/p>\n<pre>App.OnStart = Collect( CachedOrders, Orders )\nGallery1.Items = CachedOrders\nForm1.Datasource = Orders\nButton1.OnSelect = SubmitForm( Form1 );\u00a0 ClearCollect( CachedOrders, Orders )<\/pre>\n<p>You wrote this in the future:<\/p>\n<pre>Orders.Prefetch = True\nGallery1.Items = Orders\nForm1.Datasource = Orders\nButton1.OnSelect = SubmitForm( Form1 )<\/pre>\n<p>This example is a little less nuanced.\u00a0 The second form is much simpler, more powerful, and is easier to write.\u00a0 Rather than having each maker manually manage their own caches with Collect in OnStart, the system can do the work\u00a0 on their behalf.\u00a0 Declarative directives like &#8220;Prefetch this table&#8221; and &#8220;Cache this table for two hours&#8221; are all that are needed to control the caching.\u00a0 \u00a0Simple knobs rather than many lines of complex imperative code.<\/p>\n<p>The advantages:<\/p>\n<ul>\n<li>Formulas in the app don&#8217;t need to be modified.\u00a0 With or without caching, Gallery1.Items is bound to Orders.\u00a0 We don&#8217;t need to change all the formulas to reference an in-memory collection (CacheOrders) instead of the true data source.\u00a0 This means that prefetching and caching can be added or modified later without changing the behavior of the app.<\/li>\n<li>Going beyond the non-delegation limit.\u00a0 Collect is limited to 2,000 records max.\u00a0 Getting beyond this limit in a collection requires a lot of complex formula writing and so many people don&#8217;t bother.\u00a0 And then they may have a bug when they scale their app up.\u00a0 Using the direct data source can incrementally go beyond this limit.<\/li>\n<li>Pulling only what is initially needed.\u00a0 Likewise, the Gallery control can page in more data as it needs it.\u00a0 Initially, it may only need the first 100 records.\u00a0 Since it all doesn&#8217;t need to be there initially as with App.OnStart, the prefetch directive could indicate how many records should be brought in at first and then the rest paged.<\/li>\n<li>Cache doesn&#8217;t need to be manually updated after a change.\u00a0 If the original data source is updated, the cache has to be updated manually.\u00a0 This is cumbersome and error prone, or the entire cache has to be invalidated which is inefficient.<\/li>\n<\/ul>\n<h2>It&#8217;s a journey<\/h2>\n<p>Thanks for reading.\u00a0 Let it sink in.\u00a0 We have a journey ahead of us that we believe will result in better and easier to write apps.\u00a0 But to get there we have some old patterns to unlearn and some new patterns to establish.\u00a0 That will be hard at time and will take some effort, but we&#8217;ll get there.<\/p>\n<p>It starts with a single first step which for us is App.StartScreen and that is all we adding today.\u00a0 Feel free to post your questions and comments below and in the <a href=\"https:\/\/powerusers.microsoft.com\/t5\/Power-Apps-Community\/ct-p\/PowerApps1\">community forum<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>There is a new declarative way to control the first screen shown in a Canvas app: App.StartScreen.  It is our first step in providing declarative alternatives for all the things that are done in App.OnStart today.  App.OnStart is the source of many app load performance issues as it&#8217;s imperative nature prevents many optimizations.  Not only that, declarative alternatives are easier to use and less error prone.<\/p>\n","protected":false},"author":86,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ms_queue_id":[],"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","_alt_title":"","ms-ems-related-posts":[],"footnotes":""},"audience":[3378],"content-type":[],"job-role":[],"product":[3473],"property":[],"topic":[3421],"coauthors":[2104],"class_list":["post-16951","post","type-post","status-publish","format-standard","hentry","audience-it-professional","product-power-apps","topic-application-modernization"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>App.StartScreen: a new declarative alternative to Navigate in App.OnStart - Microsoft Power Platform Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"App.StartScreen: a new declarative alternative to Navigate in App.OnStart - Microsoft Power Platform Blog\" \/>\n<meta property=\"og:description\" content=\"There is a new declarative way to control the first screen shown in a Canvas app: App.StartScreen. It is our first step in providing declarative alternatives for all the things that are done in App.OnStart today. App.OnStart is the source of many app load performance issues as it&#039;s imperative nature prevents many optimizations. Not only that, declarative alternatives are easier to use and less error prone.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/power-apps\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft Power Platform Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-21T04:08:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-11T14:52:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.png\" \/>\n\t<meta property=\"og:image:width\" content=\"681\" \/>\n\t<meta property=\"og:image:height\" content=\"315\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Greg Lindhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Greg Lindhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/\"},\"author\":[{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/author\/greg-lindhorst\/\",\"@type\":\"Person\",\"@name\":\"Greg Lindhorst\"}],\"headline\":\"App.StartScreen: a new declarative alternative to Navigate in App.OnStart\",\"datePublished\":\"2021-10-21T04:08:43+00:00\",\"dateModified\":\"2025-06-11T14:52:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/\"},\"wordCount\":1879,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.png\",\"keywords\":[\"Formulas\",\"Power Fx\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/\",\"name\":\"App.StartScreen: a new declarative alternative to Navigate in App.OnStart - Microsoft Power Platform Blog\",\"isPartOf\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.png\",\"datePublished\":\"2021-10-21T04:08:43+00:00\",\"dateModified\":\"2025-06-11T14:52:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#primaryimage\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.webp\",\"contentUrl\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.webp\",\"width\":681,\"height\":315,\"caption\":\"graphical user interface, application\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"App.StartScreen: a new declarative alternative to Navigate in App.OnStart\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#website\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/\",\"name\":\"Microsoft Power Platform Blog\",\"description\":\"Innovate with Business Apps\",\"publisher\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization\",\"name\":\"Microsoft Power Platform Blog\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"contentUrl\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"width\":194,\"height\":145,\"caption\":\"Microsoft Power Platform Blog\"},\"image\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/person\/dbd4cb8af4503e696f240353831f05d4\",\"name\":\"Greg Lindhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g0133d144d5ed416197bd3b29ccd9a59c\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g\",\"caption\":\"Greg Lindhorst\"},\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/author\/gregli\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"App.StartScreen: a new declarative alternative to Navigate in App.OnStart - Microsoft Power Platform Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/","og_locale":"en_US","og_type":"article","og_title":"App.StartScreen: a new declarative alternative to Navigate in App.OnStart - Microsoft Power Platform Blog","og_description":"There is a new declarative way to control the first screen shown in a Canvas app: App.StartScreen. It is our first step in providing declarative alternatives for all the things that are done in App.OnStart today. App.OnStart is the source of many app load performance issues as it's imperative nature prevents many optimizations. Not only that, declarative alternatives are easier to use and less error prone.","og_url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/power-apps\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/","og_site_name":"Microsoft Power Platform Blog","article_published_time":"2021-10-21T04:08:43+00:00","article_modified_time":"2025-06-11T14:52:11+00:00","og_image":[{"width":681,"height":315,"url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.png","type":"image\/png"}],"author":"Greg Lindhorst","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Greg Lindhorst","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#article","isPartOf":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/"},"author":[{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/author\/greg-lindhorst\/","@type":"Person","@name":"Greg Lindhorst"}],"headline":"App.StartScreen: a new declarative alternative to Navigate in App.OnStart","datePublished":"2021-10-21T04:08:43+00:00","dateModified":"2025-06-11T14:52:11+00:00","mainEntityOfPage":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/"},"wordCount":1879,"commentCount":0,"publisher":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization"},"image":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#primaryimage"},"thumbnailUrl":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.png","keywords":["Formulas","Power Fx"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/","name":"App.StartScreen: a new declarative alternative to Navigate in App.OnStart - Microsoft Power Platform Blog","isPartOf":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#primaryimage"},"image":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#primaryimage"},"thumbnailUrl":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.png","datePublished":"2021-10-21T04:08:43+00:00","dateModified":"2025-06-11T14:52:11+00:00","breadcrumb":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#primaryimage","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.webp","contentUrl":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2021\/10\/2021-10-20_18h39_12.webp","width":681,"height":315,"caption":"graphical user interface, application"},{"@type":"BreadcrumbList","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2021\/10\/20\/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/"},{"@type":"ListItem","position":2,"name":"App.StartScreen: a new declarative alternative to Navigate in App.OnStart"}]},{"@type":"WebSite","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#website","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/","name":"Microsoft Power Platform Blog","description":"Innovate with Business Apps","publisher":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization","name":"Microsoft Power Platform Blog","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","contentUrl":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","width":194,"height":145,"caption":"Microsoft Power Platform Blog"},"image":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/person\/dbd4cb8af4503e696f240353831f05d4","name":"Greg Lindhorst","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g0133d144d5ed416197bd3b29ccd9a59c","url":"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g","caption":"Greg Lindhorst"},"url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/author\/gregli\/"}]}},"bloginabox_animated_featured_image":null,"bloginabox_display_generated_audio":false,"distributor_meta":false,"distributor_terms":false,"distributor_media":false,"distributor_original_site_name":"Microsoft Power Platform Blog","distributor_original_site_url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog","push-errors":false,"_links":{"self":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/16951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/users\/86"}],"replies":[{"embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/comments?post=16951"}],"version-history":[{"count":1,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/16951\/revisions"}],"predecessor-version":[{"id":130264,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/16951\/revisions\/130264"}],"wp:attachment":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/media?parent=16951"}],"wp:term":[{"taxonomy":"audience","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/audience?post=16951"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/content-type?post=16951"},{"taxonomy":"job-role","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/job-role?post=16951"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/product?post=16951"},{"taxonomy":"property","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/property?post=16951"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/topic?post=16951"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/coauthors?post=16951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}