<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://web.dev/</id>
  <title>Adriana Jara on web.dev</title>
  <updated>2026-04-15T23:21:06Z</updated>
  <author>
    <name>Adriana Jara</name>
  </author>
  <link href="https://web.dev/authors/ajara/feed.xml" rel="self"/>
  <link href="https://web.dev/"/>
  <icon>https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/fSWKElF58iFEzXGkfOj9.jpg?auto=format</icon>
  <logo>https://web.dev/images/shared/rss-banner.png</logo>
  <subtitle>Adriana is a Developer Relations Engineer</subtitle>
  
  
  <entry>
    <title>How to add Richer Install UI</title>
    <link href="https://web.dev/patterns/web-apps/richer-install-ui/"/>
    <updated>2023-03-27T00:00:00Z</updated>
    <id>https://web.dev/patterns/web-apps/richer-install-ui/</id>
    <content type="html" mode="escaped">&lt;p&gt;App stores provide a space for developers to showcase their apps before installation, with screenshots and text information that help the user make the choice to install the app. Richer install UI provides a similar space for web app developers to invite their users to install their app, directly from the browser. This enhanced UI is available in Chrome for Android and desktop environments.&lt;/p&gt;
&lt;h2 id=&quot;default-prompt&quot;&gt;Default prompt &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/patterns/web-apps/richer-install-ui/#default-prompt&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;See the example below for the default experience, which doesn’t provide enough context.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt=&quot;The browser default install dialog for desktop.&quot; decoding=&quot;async&quot; height=&quot;676&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 385px) 385px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/yshUdzH27Gm1Rzdj9s8O.png?auto=format&amp;w=770 770w&quot; width=&quot;385&quot; /&gt;
 &lt;figcaption&gt;
    Default install dialog on desktop
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt=&quot;The browser default install dialog for mobile.&quot; decoding=&quot;async&quot; height=&quot;781&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 556px) 556px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/SeARmcA1EicLXagFnVOe0ou9cqK2/y5sNbIN19bPNbqni3xay.png?auto=format&amp;w=1112 1112w&quot; width=&quot;556&quot; /&gt;
 &lt;figcaption&gt;
    Default install dialog on mobile
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;richer-install-ui&quot;&gt;Richer Install UI &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/patterns/web-apps/richer-install-ui/#richer-install-ui&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To get the Richer Install UI dialog instead of the regular small default prompt,  add  &lt;code&gt;screenshots&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; fields to your web manifest. Check out the Squoosh.app example below:&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Richer Install UI on desktop and mobile&quot; decoding=&quot;async&quot; height=&quot;386&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/vvhSqZboQoZZN9wBvoXq72wzGAf1/5SlCnibmZHqkXdGVgPZY.jpeg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;
    Richer installation UI on desktop and mobile.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The Richer Install UI dialog is composed of the contents of the &lt;code&gt;description&lt;/code&gt; and &lt;code&gt;screenshots&lt;/code&gt; fields in the web manifest.&lt;/p&gt;
&lt;p&gt;To trigger the dialog you just need to add at least one screenshot for the corresponding form factor, but it is recommended to add the description as well. Checkout the specifics for those fields below.&lt;/p&gt;
&lt;h2 id=&quot;screenshots&quot;&gt;Screenshots &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/patterns/web-apps/richer-install-ui/#screenshots&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Screenshots really add the &#39;richer&#39; part to the new install UI and we strongly recommend their use. In your manifest you add the &lt;code&gt;screenshots&lt;/code&gt; member, which takes an array that requires at least one image and Chrome will display up to eight. An example is shown below.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;screenshots&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;token property&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;source/image1.gif&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;sizes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;640x320&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;image/gif&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;form_factor&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wide&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Wonder Widgets&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Screenshots must follow these criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Width and height must be at least 320px and at most 3,840px.&lt;/li&gt;
&lt;li&gt;The maximum dimension can&#39;t be more than 2.3 times as long as the minimum dimension.&lt;/li&gt;
&lt;li&gt;All screenshots with the &lt;em&gt;same form factor&lt;/em&gt; value must have &lt;em&gt;identical aspect ratios&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Only JPEG and PNG image formats are supported.&lt;/li&gt;
&lt;li&gt;Only eight screenshots will be shown. If more are added, the user agent simply ignores them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, you need to include the size and type of the image so it renders correctly. &lt;a href=&quot;https://glitch.com/edit/#!/richerinstall-screenshot?path=manifest.json%3A14%3A24&quot; rel=&quot;noopener&quot;&gt;See this demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;form_factor&lt;/code&gt; indicates to the browser whether the screenshot should appear on desktop (&lt;code&gt;wide&lt;/code&gt;) or mobile environments (&lt;code&gt;narrow&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&quot;description&quot;&gt;Description &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/patterns/web-apps/richer-install-ui/#description&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;description&lt;/code&gt; member describes the application in the installation prompt, to invite the user to keep the app.&lt;/p&gt;
&lt;p&gt;The dialog would display even without a &lt;code&gt;description&lt;/code&gt;, but it is encouraged.
There is a maximum that kicks in after 7 lines of text (roughly 324 characters) and longer descriptions are truncated and an ellipsis is appended (as you can see in &lt;a href=&quot;https://glitch.com/edit/#!/richerinstall-longer-description&quot; rel=&quot;noopener&quot;&gt;this example&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;…&lt;br /&gt;&lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &quot;Compress and compare images with different codecs&lt;br /&gt;right in your browser.&quot;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;figure&gt;
  &lt;img alt=&quot;Description added&quot; decoding=&quot;async&quot; height=&quot;684&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 342px) 342px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/oOj7Ls7cQ8E274faxfOz.jpg?auto=format&amp;w=684 684w&quot; width=&quot;342&quot; /&gt;
  &lt;figcaption&gt;Description added.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;A longer description that has been truncated.&quot; decoding=&quot;async&quot; height=&quot;684&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 342px) 342px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/xizoeLGxYNf3VLUHc5BsIoiE1Af1/Dpzs03K6QmBkZaefX2nU.jpg?auto=format&amp;w=684 684w&quot; width=&quot;342&quot; /&gt;
  &lt;figcaption&gt;Longer descriptions are truncated.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The description appears at the top of the installation prompt.&lt;/p&gt;
&lt;p&gt;You may have noticed from the screenshots that installation dialogs also list the app&#39;s origin. Origins that are too long to fit the UI are truncated, this is also known as eliding and is used
as a &lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/master/docs/security/url_display_guidelines/url_display_guidelines.md#eliding-urls&quot; rel=&quot;noopener&quot;&gt;security measure to protect users&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further reading &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/patterns/web-apps/richer-install-ui/#further-reading&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/richer-pwa-installation/&quot; rel=&quot;noopener&quot;&gt;Richer PWA installation UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/richer-install-ui-desktop/&quot; rel=&quot;noopener&quot;&gt;Richer install UI available for desktop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;demo&quot;&gt;Demo &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/patterns/web-apps/richer-install-ui/#demo&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
</content>
    <author>
      <name>Adriana Jara</name>
    </author>
  </entry>
  
  <entry>
    <title>How Chrome handles updates to the web app manifest</title>
    <link href="https://web.dev/manifest-updates/"/>
    <updated>2020-10-14T00:00:00Z</updated>
    <id>https://web.dev/manifest-updates/</id>
    <content type="html" mode="escaped">&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; We are currently gathering data on browsers other than Chrome. If you would like to help us gather this data or add content to this page, please leave a comment in &lt;a href=&quot;https://github.com/GoogleChrome/web.dev/issues/4038&quot;&gt;issue #4038&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;When a PWA is installed, the browser uses information from the web app
manifest for the app name, the icons the app should use, and the URL that
should be opened when the app is launched. But what if you need to update
app shortcuts or try a new theme color? When and how are those changes
reflected in the browser?&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; Do not change the name or location of your web app manifest file, doing so may prevent the browser from updating your PWA. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;In most cases, changes should be reflected within a day or two of the
PWA being launched, after the manifest has been updated.&lt;/p&gt;
&lt;h2 id=&quot;cr-desktop&quot;&gt;Updates on desktop Chrome &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/manifest-updates/#cr-desktop&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When the PWA is launched, or opened in a browser tab, Chrome determines the
last time the local manifest was checked for changes. If the manifest hasn&#39;t
been checked since the browser last started, or it hasn&#39;t been checked in the
last 24 hours, Chrome will make a network request for the manifest, then
compare it against the local copy.&lt;/p&gt;
&lt;p&gt;If select properties in the manifest have changed (see list below), Chrome
queues the new manifest, and after all windows have been closed, installs it.
Once installed, all fields from the new manifest (except &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;short_name&lt;/code&gt;,
and &lt;code&gt;icons&lt;/code&gt;) are updated.&lt;/p&gt;
&lt;h3 id=&quot;cr-desktop-trigger&quot;&gt;Which properties will trigger an update? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/manifest-updates/#cr-desktop-trigger&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;display&lt;/code&gt; (see below)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shortcuts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;theme_color&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file_handlers&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; Changes to &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;short_name&lt;/code&gt; and &lt;code&gt;icons&lt;/code&gt; are &lt;strong&gt;not&lt;/strong&gt; currently supported on desktop Chrome, though work is underway to support them. &lt;/div&gt;&lt;/aside&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; Changes to the &lt;code&gt;start_url&lt;/code&gt; require the manifest &lt;code&gt;id&lt;/code&gt; to be set. &lt;a href=&quot;https://developer.chrome.com/blog/pwa-manifest-id/&quot;&gt;More info&lt;/a&gt; &lt;/div&gt;&lt;/aside&gt;
&lt;!-- CrBug for name/shortname https://crbug.com/1088338 --&gt;
&lt;!-- CrBug for start_url https://crbug.com/1095947 --&gt;
&lt;h3 id=&quot;what-happens-when-the-display-field-is-updated&quot;&gt;What happens when the &lt;code&gt;display&lt;/code&gt; field is updated? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/manifest-updates/#what-happens-when-the-display-field-is-updated&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you update your app&#39;s display mode from &lt;code&gt;browser&lt;/code&gt; to &lt;code&gt;standalone&lt;/code&gt; your
existing users will not have their apps open in a window after updating. There
are two display settings for a web app, the one from the manifest (that you
control) and a window/browser tab setting controlled by the user. The user
preference is always respected.&lt;/p&gt;
&lt;h3 id=&quot;cr-desktop-test&quot;&gt;Testing manifest updates &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/manifest-updates/#cr-desktop-test&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;chrome://web-app-internals&lt;/code&gt; page (available in Chrome 85 or later),
includes detailed information about all of the PWAs installed on the device,
and can help you understand when the manifest was last updated, how often
it&#39;s updated, and more.&lt;/p&gt;
&lt;p&gt;To manually force Chrome to check for an updated manifest, you can either launch
Chrome with the &lt;a href=&quot;https://www.chromium.org/developers/how-tos/run-chromium-with-flags&quot; rel=&quot;noopener&quot;&gt;command line flag&lt;/a&gt; &lt;code&gt;--disable-manifest-update-throttle&lt;/code&gt;
or restart Chrome (use &lt;code&gt;about://restart&lt;/code&gt;), this resets the timer so that Chrome
will check for an updated manifest when the PWA is next launched. Then launch
the PWA. After closing the PWA, it should be updated with the new manifest
properties.&lt;/p&gt;
&lt;h3 id=&quot;cr-desktop-ref&quot;&gt;References &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/manifest-updates/#cr-desktop-ref&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.google.com/document/d/1twU_yAoTDp4seZMmqrDzJFQtrM7Z60jXHkXjMIO2VpM/preview&quot; rel=&quot;noopener&quot;&gt;Updatable Web Manifest Fields&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cr-android&quot;&gt;Updates on Chrome for Android &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/manifest-updates/#cr-android&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When the PWA is launched, Chrome determines the last time the local manifest
was checked for changes. If the manifest hasn&#39;t been checked in the last 24
hours, Chrome will schedule a network request for the manifest, then compare
it against the local copy.&lt;/p&gt;
&lt;p&gt;If select properties in the manifest have changed (see list below), Chrome
queues the new manifest, and after all windows of the PWA have been closed,
the device is plugged in, and connected to WiFi, Chrome requests an updated
WebAPK from the server. Once updated, all fields from the new manifest are
used.&lt;/p&gt;
&lt;h3 id=&quot;cr-android-trigger&quot;&gt;Which properties will trigger an update? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/manifest-updates/#cr-android-trigger&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;background_color&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;display&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;orientation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shortcuts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;theme_color&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web_share_target&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If Chrome is unable to get an updated manifest from the server, it may
increase the time between checks to 30 days.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; Changes to &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;short_name&lt;/code&gt; and &lt;code&gt;icons&lt;/code&gt; are &lt;strong&gt;not&lt;/strong&gt; currently supported on Android Chrome, though work is underway to support them. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;cr-android-test&quot;&gt;Testing manifest updates &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/manifest-updates/#cr-android-test&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;about://webapks&lt;/code&gt; page includes detailed information about all of the
PWAs installed on the device, and can tell you when the manifest was last
updated, how often it&#39;s updated, and more.&lt;/p&gt;
&lt;p&gt;To manually schedule an update to the manifest, overriding the timer and
local manifest do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Plug in the device and ensure it&#39;s connected to WiFi.&lt;/li&gt;
&lt;li&gt;Use the Android task manager to shut down the PWA, then use the App panel
in Android settings to force stop the PWA.&lt;/li&gt;
&lt;li&gt;In Chrome, open &lt;code&gt;about://webapks&lt;/code&gt; and click the &amp;quot;Update&amp;quot; button for the
PWA. &amp;quot;Update Status&amp;quot; should change to &amp;quot;Pending&amp;quot;.&lt;/li&gt;
&lt;li&gt;Launch the PWA, and verify it&#39;s loaded properly.&lt;/li&gt;
&lt;li&gt;Use the Android task manager to shut down the PWA, then use the App panel
in Android settings to force stop the PWA.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The PWA usually updates within a few minutes, once the update has completed,
&amp;quot;Update Status&amp;quot; should change to &amp;quot;Successful&amp;quot;&lt;/p&gt;
&lt;h3 id=&quot;cr-android-ref&quot;&gt;References &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/manifest-updates/#cr-android-ref&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cs.chromium.org/chromium/src/chrome/browser/android/webapk/webapk.proto?l=35&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;UpdateReason&lt;/code&gt; enum&lt;/a&gt; for Chrome on Android&lt;/li&gt;
&lt;/ul&gt;
</content>
    <author>
      <name>Pete LePage</name>
    </author><author>
      <name>Adriana Jara</name>
    </author><author>
      <name>François Beaufort</name>
    </author>
  </entry>
</feed>
