<script data-pm-proxy="intercept"></script><?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Modern Web Weekly]]></title><description><![CDATA[A weekly update on Progressive Web Apps (PWA), Web Components and new features of the modern web platform, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!zlvL!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eca4d82-112d-48ce-99ab-dcf5b2822ac0_256x256.png</url><title>Modern Web Weekly</title><link>https://modernwebweekly.substack.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 03 Sep 2026 10:42:33 GMT</lastBuildDate><atom:link href="/__u/modernwebweekly.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Danny Moerkerke]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[modernwebweekly@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[modernwebweekly@substack.com]]></itunes:email><itunes:name><![CDATA[Danny Moerkerke]]></itunes:name></itunes:owner><itunes:author><![CDATA[Danny Moerkerke]]></itunes:author><googleplay:owner><![CDATA[modernwebweekly@substack.com]]></googleplay:owner><googleplay:email><![CDATA[modernwebweekly@substack.com]]></googleplay:email><googleplay:author><![CDATA[Danny Moerkerke]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[When Push Notifications Don’t Show Up On Your Samsung Phone]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/when-push-notifications-dont-show</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/when-push-notifications-dont-show</guid><pubDate>Thu, 20 Aug 2026 12:46:37 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="5184" height="3888" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3888,&quot;width&quot;:5184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;person holding phone&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="person holding phone" title="person holding phone" srcset="https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1514464750060-00e6e34c8b8c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxwdXNoJTIwbm90aWZpY2F0aW9uc3xlbnwwfHx8fDE3ODcyMjA0MDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@jamie452">Jamie Street</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/p/when-push-notifications-dont-show?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/modernwebweekly.substack.com/p/when-push-notifications-dont-show?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p><strong>Modern Web Weekly #78</strong></p><p>I received quite a few questions lately about push notifications coming from PWAs that only display in the notification tray on Samsung phones, but not on the lock screen. This means that there is only a small icon shown in the status bar of the screen, but the notification itself isn&#8217;t.</p><p>This is a problem because this way, it&#8217;s not always clear that a push notification was received. This limitation doesn&#8217;t apply to native apps, only PWAs,  so to put it bluntly, it sucks.</p><p>This especially pertains to Samsung phones since they&#8217;re running One UI, which is Samsung&#8217;s customized software interface for its Galaxy phones and tablets. It has aggressive battery and notification management features that intentionally suppress push notifications coming from web apps to prevent malicious web apps from spamming users.</p><p>After some research, I found out this can be solved by explicitly setting <em>notification categories</em> for PWAs.</p><p>On your Samsung phone, go to <em>Settings &gt; Apps &gt; [your PWA] &gt; Notifications</em> and look for <em>Notification categories</em>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lXnN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lXnN!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!lXnN!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!lXnN!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!lXnN!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lXnN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg" width="357" height="700" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:700,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53235,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lXnN!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!lXnN!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!lXnN!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!lXnN!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7353749a-9387-40cb-b04d-2b5eb75a6b06_357x700.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you don&#8217;t see <em>Notification categories</em>, first go to <em>Settings &gt; Notifications &gt; Advanced settings</em>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!r7Fk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!r7Fk!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!r7Fk!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!r7Fk!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!r7Fk!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!r7Fk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg" width="357" height="489" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:489,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35030,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!r7Fk!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!r7Fk!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!r7Fk!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!r7Fk!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f841bd1-f027-4dd9-94b0-263b66882da1_357x489.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Inside <em>Advanced settings</em>, enable <em>Manage notification categories for each app</em>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!GVJt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!GVJt!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!GVJt!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!GVJt!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!GVJt!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!GVJt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg" width="357" height="429" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:429,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47116,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!GVJt!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!GVJt!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!GVJt!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!GVJt!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59c9f65-b190-49b7-80c0-a54c960e1c03_357x429.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now go back to <em>Settings &gt; Apps &gt; [your PWA] &gt; Notifications,</em> and you should see <em>Notification categories</em>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!jr48!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!jr48!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!jr48!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!jr48!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!jr48!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!jr48!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg" width="357" height="700" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:700,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53235,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!jr48!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!jr48!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!jr48!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!jr48!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17191252-e5f7-4862-a2ee-adcc24b5270f_357x700.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you tap <em>Notification categories</em>, you may see:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!-STv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!-STv!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!-STv!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!-STv!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!-STv!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!-STv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg" width="357" height="266" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:266,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19173,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!-STv!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!-STv!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!-STv!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!-STv!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bf0bb7f-654f-4756-b66d-04c86301bcf0_357x266.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This means your PWA hasn&#8217;t received any push notifications yet. </p><p>Send a push notification to your PWA and then open <em>Notification categories </em>again. You should now be able to enable the <em>General</em> category:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!jt3w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!jt3w!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!jt3w!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!jt3w!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!jt3w!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!jt3w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg" width="357" height="317" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:317,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:17568,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!jt3w!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!jt3w!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!jt3w!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!jt3w!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c5b5379-4e8e-4aed-819d-b205bee70040_357x317.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you now send a push notification again, it should show up on the lock screen:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!azgb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!azgb!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!azgb!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!azgb!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!azgb!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!azgb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg" width="357" height="268" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:268,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51783,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!azgb!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!azgb!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!azgb!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!azgb!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb1515-3797-463a-8e24-6ae1b544371a_357x268.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Make sure you have also correctly set the other options for your app&#8217;s notifications:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!0gir!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!0gir!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!0gir!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!0gir!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!0gir!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!0gir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg" width="357" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47384,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!0gir!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!0gir!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!0gir!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!0gir!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed813656-0fa4-47c6-84ea-7ba50c6bc1c6_357x601.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You may first see a push notification that looks collapsed and that only expands to show its content when you tap it. If you want push notifications to be expanded by default, go to <em>Settings &gt; Notifications &gt; Notification pop-up style</em>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!n7-A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!n7-A!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!n7-A!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!n7-A!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!n7-A!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!n7-A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg" width="357" height="373" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:373,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28434,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!n7-A!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!n7-A!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!n7-A!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!n7-A!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54578012-e376-4382-addc-ca44387e1a08_357x373.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here you can enable <em>Detailed</em>, so the notification will be expanded by default:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!YFWx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!YFWx!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!YFWx!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!YFWx!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!YFWx!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!YFWx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg" width="357" height="325" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:325,&quot;width&quot;:357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:21823,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!YFWx!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!YFWx!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!YFWx!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!YFWx!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d2fc9e-e576-46c4-bce7-46d4c4c37991_357x325.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Now Really Deprecated:<br>&lt;meta name=&#8221;apple-mobile-web-app-capable&#8221; content=&#8221;yes&#8221;&gt; </h2><p><span>On iOS 26.5, you no longer need to add the meta tag </span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;meta name="apple-mobile-web-app-capable" content="yes"&gt;  </code></pre></div><p><span>to show splash screens on iOS.  </span></p><p><span>It has been required for years on iOS devices to make sure an installed web app would get a standalone layout without any browser controls, but has been officially deprecated in 2011 in favor of </span><code>display: standalone</code><span> in manifest.json.<br><br>For iOS, it was deprecated since iOS 11.3, but it was still needed to show splash screens on iOS.  Since iOS 26.5, I noticed, this is no longer the case: splash screens are displayed on iOS without this meta tag.</span></p><p><span>Nevertheless, I strongly advise you to keep it around in your PWA for some years to make sure people running an iPhone with a version &lt; 26.5 also get to see the splash screen of your PWA.</span></p><div><hr></div><h2>Why You Should Prefer <code>cache.match()</code> Over <code>caches.match()</code></h2><p><code>caches.match()</code> seems like a handy convenience method to quickly find a response in any of the caches your service worker controls, and I admit I always used it until recently.</p><p>It is functionally equivalent to this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const cacheNames = await caches.keys();

let response;

for (const cacheName of cacheNames) {
  const cache = await caches.open(cacheName);
  response = await cache.match(request);

  if (response) {
    return response;
  }
}</code></pre></div><p>Personally, I always preferred caches.match() and didn&#8217;t have any issues with it, but you may run into subtle bugs with it.</p><p>The problem is that <code>caches.match</code>() tries to find a response <em>in all caches that the service worker controls</em>. This doesn&#8217;t have to be a problem per se, but if you have versioned cache names (you should!) and your PWA doesn&#8217;t take good care of cleaning up outdated caches, it may serve content from an old cache.</p><p>Imagine your PWA has a cache named <code>my-pwa-cache-123</code> where 123 is the version number. If you release a new version and the version number becomes 124, the name of the new cache will be <code>my-pwa-cache-124.</code></p><p>But if your PWA doesn&#8217;t correctly delete the cache <code>my-pwa-cache-123</code>, you end up with two caches: <code>my-pwa-cache-123</code> and <code>my-pwa-cache-124.</code></p><p>If you now call caches.match() to look for a response, it will look in both caches, and it may pick a possibly outdated response from <code>my-pwa-cache-123.</code></p><p>Your PWA should, of course, take care of deleting any outdated caches, but if this fails for whatever reason, <code>caches.match()</code> may return an outdated response. So for that reason, it&#8217;s better to use <code>cache.match()</code>, even if it&#8217;s a little more code.</p><div><hr></div><h2>Ship A PWA Users Can Trust</h2><p>I recently launched <a href="https://pwa.today/">PWA Today</a>, an automated auditing service for progressive web apps.</p><p><span>When you deploy a new version of your PWA, you want to have the confidence that it doesn't quietly break offline support, serve stale files, or leave the service worker stuck somewhere in its lifecycle. <br><br>The PWA Today Runtime Audit helps you make sure your PWA looks, feels, and behaves like a real app. It finds runtime failures under real-world conditions, before your users do.</span></p><p>It checks:</p><ul><li><p>if your PWA is installable </p></li><li><p>if it works offline, including a cold start while offline</p></li><li><p>if URLs you configure still work when the app is offline</p></li><li><p>if it continues to work correctly after an update, online and offline</p></li><li><p>if the service worker continues to serve the correct content after an update</p></li><li><p>if requests that were made while offline are retried when the app is back online</p></li><li><p>if the service worker cache is correctly populated after an update and serves the correct content</p></li><li><p>if manifest.json has the correct configuration</p></li><li><p>if icons and screenshots are reachable and correctly configured</p></li><li><p>if your PWA contains all other configurations to make it look, feel, and behave like a real app</p></li></ul><p>When you <a href="https://pwa.today/pricing/">purchase a subscription or the prepaid Audit Pack</a>, you get access to the PWA Today Console, where you can view your audit history, configure and schedule audits, and dig deep into the diagnostic output of each audit to analyse the evidence behind each finding.</p><p>You can run audits from the console or integrate the audit into your CI/CD pipeline so you can run fully automated audits whenever you release a new version of your PWA.</p><p>Find examples of how to integrate the runtime audit into Github, Gitlab, Bitbucket, Azure, CircleCI, and Jenkins on the <a href="https://pwa.today/docs/ci-cd/">docs on the PWA Today website</a>. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!knW-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!knW-!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png 424w, /__u/substackcdn.com/image/fetch/$s_!knW-!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png 848w, /__u/substackcdn.com/image/fetch/$s_!knW-!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png 1272w, /__u/substackcdn.com/image/fetch/$s_!knW-!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!knW-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png" width="1456" height="913" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:913,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1055897,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!knW-!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png 424w, /__u/substackcdn.com/image/fetch/$s_!knW-!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png 848w, /__u/substackcdn.com/image/fetch/$s_!knW-!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png 1272w, /__u/substackcdn.com/image/fetch/$s_!knW-!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcdecf1-3def-4116-92ba-9c29a0324480_3114x1952.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">PWA Today Console</figcaption></figure></div><p>The console is a PWA itself, so you can install it on your phone or desktop and receive a push notification when an audit completes.</p><p>You can start with the free <a href="https://github.com/pwa-today/pwa-check">pwa-check</a> CLI tool to run a quick check of your PWA or run a deep analysis using the PWA Runtime Audit.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://pwa.today/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_IKX!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!_IKX!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!_IKX!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_IKX!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_IKX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1315115,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://pwa.today/&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/211909637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!_IKX!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!_IKX!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!_IKX!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_IKX!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7107ce9-3ef4-46c9-83f2-854048968074_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[The State Of Link Capturing in PWAs]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/the-state-of-link-capturing-in-pwas</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/the-state-of-link-capturing-in-pwas</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Fri, 24 Jul 2026 14:15:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CKy-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!CKy-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!CKy-!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp 424w, /__u/substackcdn.com/image/fetch/$s_!CKy-!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp 848w, /__u/substackcdn.com/image/fetch/$s_!CKy-!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!CKy-!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!CKy-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp" width="1400" height="934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:934,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32566,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!CKy-!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp 424w, /__u/substackcdn.com/image/fetch/$s_!CKy-!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp 848w, /__u/substackcdn.com/image/fetch/$s_!CKy-!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!CKy-!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0d0acb-b249-41ee-bd7f-8bd1c8baf541_1400x934.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/p/the-state-of-link-capturing-in-pwas?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/modernwebweekly.substack.com/p/the-state-of-link-capturing-in-pwas?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p><strong>Modern Web Weekly #77</strong></p><p>One of the best features of native apps is that they can capture links within their scope to enable deep linking.</p><p>For example, when I have the Instagram app installed on my phone and someone sends me a link to an Instagram post and I click it, it will open the Instagram app instead of a browser.</p><p>PWAs also have this capability, but unfortunately, the story of where this works and when is a bit complicated. It differs on various OSes and browsers, so it&#8217;s not always easy to know when deep linking will work.</p><p>To help understand deep linking into PWAs, I tested all options, and here are my findings.</p><h4>Web App link handling</h4><p>Chromium-based browsers like Chrome and Edge support the <code>handle_links</code>member of the <code>manifest.json</code> file that enables PWAs to capture links within their scope, which simply means that the URL is within the <code>scope</code> as defined in <code>manifest.json</code>.</p><p>So when the scope of a PWA is &#8220;https://www.example.com/&#8221; and the URL of the clicked link is &#8220;https://www.example.com/foo&#8221;, then it will be captured by the PWA.</p><p>When a PWA wants to use this behavior, the <code>handle_links</code> member should be added to <code>manifest.json</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">"handle_links": "preferred"</code></pre></div><p>The <code>handle_links</code> member can hold the following values:</p><ul><li><p>&#8220;preferred&#8221;: the user agent should handle links using matching PWAs and may promote link handling behavior.</p></li><li><p>&#8220;not-preferred&#8221;: the user agent should not handle links using matching PWAs and may not promote link handling behavior.</p></li><li><p>&#8220;auto&#8221;: default value if <code>handle_links</code> is not found in the manifest. The user agent may choose between &#8220;preferred&#8221; and &#8220;not-preferred&#8221;.</p></li></ul><p>See the <a href="https://github.com/WICG/pwa-url-handler/blob/main/handle_links/explainer.md">explainer</a> for details.</p><p>I tested the behavior of this on all platforms in all major browsers by sending a link in an email to myself and then clicking that link.</p><h4>Android</h4><p><em>PWA installed with Chrome<br></em>When I click the link in the GMail app or in Chrome, it&#8217;s always opened in the PWA, even when Chrome is not the default browser.</p><p>When the email is opened in Edge through the GMail website, and I click the link, it opens in Edge but also offers to open it in the PWA:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!7xOp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!7xOp!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp 424w, /__u/substackcdn.com/image/fetch/$s_!7xOp!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp 848w, /__u/substackcdn.com/image/fetch/$s_!7xOp!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!7xOp!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!7xOp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp" width="300" height="667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:667,&quot;width&quot;:300,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:17902,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!7xOp!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp 424w, /__u/substackcdn.com/image/fetch/$s_!7xOp!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp 848w, /__u/substackcdn.com/image/fetch/$s_!7xOp!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!7xOp!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ffc90b1-5658-4fdf-b9a4-bdde9e8dc408_300x667.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Opening link in Edge on Android with PWA installed with Chrome</figcaption></figure></div><p><em>PWA installed with Edge<br></em><span>When I click the link in the GMail app, the link is not opened in the PWA but in an in-app browser powered by the default browser:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!7954!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!7954!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp 424w, /__u/substackcdn.com/image/fetch/$s_!7954!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp 848w, /__u/substackcdn.com/image/fetch/$s_!7954!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!7954!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!7954!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp" width="1400" height="1015" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1015,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:143068,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!7954!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp 424w, /__u/substackcdn.com/image/fetch/$s_!7954!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp 848w, /__u/substackcdn.com/image/fetch/$s_!7954!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!7954!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F743df304-972f-4dd8-a38a-6d2e105cdc56_1400x1015.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Link opened in in-app browser</figcaption></figure></div><p>When the email is opened in any browser through the GMail website, and I click it, it&#8217;s opened in the same browser that the GMail website was opened with.</p><p><em>PWA installed with Firefox<br></em>Here, the behaviour is the same as when the PWA is installed with Edge: when I click the link in the GMail app, the link is not opened in the PWA but in an in-app browser powered by the default browser.</p><blockquote><p><em><strong>Conclusion for Android: </strong>capturing links clicked in other apps only works reliably when the PWA is installed with Chrome.</em></p></blockquote><h4>iOS</h4><p>On iOS, there is unfortunately no support for deep linking. All clicked links open in the default browser, regardless of whether a PWA is installed and with which browser.</p><h4>ChromeOS</h4><p>On ChromeOS, the PWA can only be installed with Chrome, and deep linking works reliably.</p><h4>macOS</h4><p><em>PWA installed with Chrome<br></em>When I click the link in the Mail app, it opens in the default browser. When it&#8217;s opened in Chrome, it offers to open it in the PWA instead:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!FfYC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!FfYC!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp 424w, /__u/substackcdn.com/image/fetch/$s_!FfYC!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp 848w, /__u/substackcdn.com/image/fetch/$s_!FfYC!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!FfYC!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!FfYC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp" width="1400" height="270" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:270,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20108,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!FfYC!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp 424w, /__u/substackcdn.com/image/fetch/$s_!FfYC!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp 848w, /__u/substackcdn.com/image/fetch/$s_!FfYC!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!FfYC!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0b0213e-32eb-4f6a-9eca-73d4d9366038_1400x270.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Chrome on macOS, offering to open the PWA installed with Chrome</figcaption></figure></div><p>When I click the link on a website inside a Chrome tab that&#8217;s not the domain of the PWA, it opens in the PWA. Interestingly, there is an app setting in addition to <code>handle_links</code> to define if links should open in the app or Chrome.</p><p>You can access the app settings for a PWA by opening the PWA and clicking the triple-dot menu in the top-right corner, and then clicking &#8220;App Info&#8221;:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!8Dwj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!8Dwj!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp 424w, /__u/substackcdn.com/image/fetch/$s_!8Dwj!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp 848w, /__u/substackcdn.com/image/fetch/$s_!8Dwj!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!8Dwj!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!8Dwj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp" width="480" height="417" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:417,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9128,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!8Dwj!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp 424w, /__u/substackcdn.com/image/fetch/$s_!8Dwj!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp 848w, /__u/substackcdn.com/image/fetch/$s_!8Dwj!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!8Dwj!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa449ca4a-860e-478c-8d48-65308cd11d5a_480x417.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">PWA app settings menu</figcaption></figure></div><p>In the App Info menu, click Settings:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!MSeX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!MSeX!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp 424w, /__u/substackcdn.com/image/fetch/$s_!MSeX!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp 848w, /__u/substackcdn.com/image/fetch/$s_!MSeX!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!MSeX!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!MSeX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp" width="368" height="579" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:579,&quot;width&quot;:368,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12894,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!MSeX!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp 424w, /__u/substackcdn.com/image/fetch/$s_!MSeX!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp 848w, /__u/substackcdn.com/image/fetch/$s_!MSeX!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!MSeX!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b7652e-34cb-4f41-96a4-ab5d880cd602_368x579.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This will open a new tab in Chrome where you can set whether or not links should open in the app or Chrome:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!J9Ap!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!J9Ap!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp 424w, /__u/substackcdn.com/image/fetch/$s_!J9Ap!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp 848w, /__u/substackcdn.com/image/fetch/$s_!J9Ap!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!J9Ap!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!J9Ap!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp" width="360" height="394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:394,&quot;width&quot;:360,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7998,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!J9Ap!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp 424w, /__u/substackcdn.com/image/fetch/$s_!J9Ap!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp 848w, /__u/substackcdn.com/image/fetch/$s_!J9Ap!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!J9Ap!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997c05e9-f5bf-4f52-9e84-dbf481f0f5fe_360x394.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">PWA settings tab, opened in Chrome</figcaption></figure></div><p>Currently, this setting overrides <code>handle_links</code> when it has the value &#8220;preferred&#8221;, so when you set <code>handle_links</code> to &#8220;preferred&#8221; to open links in the app, but choose &#8220;Open in Chrome Browser&#8221; for this setting, links will no longer open in the app.</p><p>Even worse, when <code>handle_links</code> has the value &#8220;not-preferred&#8221; or &#8220;auto&#8221; or is not even present in <code>manifest.json</code>, links will always open in the browser, and this setting has no effect.</p><p>To complicate matters further, when an in-scope link is opened in Chrome while the app (without <code>handle_links</code> in its <code>manifest.json</code>) is installed, a button will show in the address bar to open the link in the app instead:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!HGv3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!HGv3!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp 424w, /__u/substackcdn.com/image/fetch/$s_!HGv3!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp 848w, /__u/substackcdn.com/image/fetch/$s_!HGv3!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!HGv3!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!HGv3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp" width="720" height="100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:100,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2194,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!HGv3!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp 424w, /__u/substackcdn.com/image/fetch/$s_!HGv3!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp 848w, /__u/substackcdn.com/image/fetch/$s_!HGv3!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!HGv3!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eab4d04-d98a-44a3-98dc-b96225c29cd2_720x100.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Button to open link in PWA in Chrome address bar</figcaption></figure></div><p>When users click this button, the link will open in the app, and a dialog will show up to inform them that there is a setting to make links open in the app:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!pBlz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!pBlz!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp 424w, /__u/substackcdn.com/image/fetch/$s_!pBlz!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp 848w, /__u/substackcdn.com/image/fetch/$s_!pBlz!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!pBlz!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!pBlz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp" width="380" height="211" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05e20b63-006f-488e-a997-a186a4278d78_380x211.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:211,&quot;width&quot;:380,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5708,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!pBlz!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp 424w, /__u/substackcdn.com/image/fetch/$s_!pBlz!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp 848w, /__u/substackcdn.com/image/fetch/$s_!pBlz!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!pBlz!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e20b63-006f-488e-a997-a186a4278d78_380x211.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">App settings dialog in app without handle_links in manifest.json</figcaption></figure></div><p>But unless <code>handle_links</code> has the value &#8220;preferred&#8221;, the setting has no effect, which is confusing.</p><p>When an installed app does have <code>handle_links</code> in its <code>manifest.json</code> and an in-scope link is opened in Chrome, the button to open the link in the app will also show in the address bar. When the user clicks this link, and the app opens, a similar alert will show in the app to inform users of the link-capturing setting:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!hHIJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!hHIJ!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp 424w, /__u/substackcdn.com/image/fetch/$s_!hHIJ!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp 848w, /__u/substackcdn.com/image/fetch/$s_!hHIJ!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!hHIJ!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!hHIJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp" width="1400" height="1012" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1012,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:58376,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!hHIJ!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp 424w, /__u/substackcdn.com/image/fetch/$s_!hHIJ!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp 848w, /__u/substackcdn.com/image/fetch/$s_!hHIJ!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!hHIJ!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3b17fec-03e5-41e3-b252-0ac6d38e4af0_1400x1012.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">App settings dialog in app with handle_links in manifest.json</figcaption></figure></div><p>When the email is opened in any browser other than Chrome through the GMail website, and I click it, it&#8217;s opened in the same browser the GMail website was opened with.</p><p><em>PWA installed with Edge<br></em>When I click the link in the Mail app, it opens in the default browser. When it&#8217;s opened in Edge, it offers to open it in the PWA instead:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!iMAM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!iMAM!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp 424w, /__u/substackcdn.com/image/fetch/$s_!iMAM!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp 848w, /__u/substackcdn.com/image/fetch/$s_!iMAM!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!iMAM!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!iMAM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp" width="1400" height="270" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:270,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19456,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!iMAM!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp 424w, /__u/substackcdn.com/image/fetch/$s_!iMAM!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp 848w, /__u/substackcdn.com/image/fetch/$s_!iMAM!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!iMAM!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1359b74-de12-42ed-adfe-c4ebb1b52cad_1400x270.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Edge on macOS, offering to open the PWA installed with Edge</figcaption></figure></div><p><em>Web app added to Dock with Safari<br></em><span>When I click the link in the Mail app, it opens in the default browser. When it&#8217;s opened in Safari, it offers to open it in the web app added to the Dock instead:</span></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lya4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lya4!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp 424w, /__u/substackcdn.com/image/fetch/$s_!lya4!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp 848w, /__u/substackcdn.com/image/fetch/$s_!lya4!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!lya4!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lya4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp" width="1400" height="270" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:270,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:14546,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lya4!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp 424w, /__u/substackcdn.com/image/fetch/$s_!lya4!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp 848w, /__u/substackcdn.com/image/fetch/$s_!lya4!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!lya4!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b947425-569a-46c5-8c20-5cbd67b721e3_1400x270.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Safari on macOS, offering to open the web app added to the Dock with Safari</figcaption></figure></div><p>But when the web app that was added to the Dock has been interacted with for a while, most notably, when it has been opened directly from the Dock at least once, <em>clicked links open in the web app consistently</em>.</p><p>On macOS, PWAs can&#8217;t be installed with Firefox.</p><blockquote><p><em><strong>Conclusion for macOS: </strong>capturing links clicked in other apps only works reliably when the web app is added to the Dock with Safari. Chrome can only capture links that are clicked in a Chrome browser tab.</em></p></blockquote><h3>Windows</h3><p><em>PWA installed with Chrome<br></em>When installed with Chrome on Windows, the behavior is the same as on macOS, so in-scope links are captured when clicked in Chrome and <code>handle_links</code> has been added to <code>manifest.json</code> with the value &#8220;preferred&#8221; and it can be overridden in app settings in that case.</p><p>In-scope links clicked in other apps are not captured.</p><p><em>PWA installed with Edge<br></em>A PWA installed with Edge captures in-scope links when clicked in another tab in Edge, but there is no setting to override this.</p><p>In-scope links clicked in other apps are not captured.</p><p>On Windows, PWAs can&#8217;t be installed with Firefox.</p><blockquote><p><em><strong>Conclusion for Windows</strong>: PWAs installed through Chrome and Edge can only capture links clicked inside browser tabs.</em></p></blockquote><h3>Push notifications</h3><p>Another important feature for PWAs is to open the PWA when a push notification is clicked.</p><p>On iOS and Android, the installed PWA is consistently opened when a push notification is tapped, even when the PWA is not running at that moment. The <code>notificationclick</code> event is fired when the notification is tapped, so it can open a URL that is defined in the notification payload.</p><p>When no <code>nofiticationclick</code> event handler is defined and the notification is tapped, the URL defined in the <code>start_url</code> property of <code>manifest.json</code> is opened on iOS. On Android, nothing happens in this case.</p><p>In the following example, the URL to open is specified in the <code>data</code> property of the notification:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">self.addEventListener(&#8217;notificationclick&#8217;, async (e) =&gt; {
  //read the notification object from the event
  const {notification} = e;

  // read the data property of the notification
  const {data} = notification;

  // close the notification
  notification.close();
  
  // open the url specified in the &#8220;url&#8221; member of the data property
  // this needs to be wrapped in the &#8220;waitUntil&#8221; method of the event 
  // to make sure the service worker stays active long enough
  e.waitUntil(clients.openWindow(data.url))
});</code></pre></div><p>Check <a href="https://whatpwacando.today/notifications">https://whatpwacando.today/notifications</a> for an example of the notification payload.</p><div><hr></div><h2><code>pwa-check</code> v0.0.9 released</h2><p>Version 0.0.9 of <code>pwa-check</code> now lists priority, impact, and a fix when it lists a warning or failure for your PWA. This means you can now get an actionable and prioritized report that you can immediately act on.</p><p><code>pwa-check</code> helps <span>you make sure your PWA looks, feels, and behaves like a real app.</span></p><p><span>You provide it the URL of the PWA you want to test and </span><code>pwa-check</code><span> scans the HTML, manifest, scripts, and service worker, then points straight at the gaps that will hurt installability or offline behavior.</span> </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://github.com/pwa-today/pwa-check" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!urDq!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png 424w, /__u/substackcdn.com/image/fetch/$s_!urDq!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png 848w, /__u/substackcdn.com/image/fetch/$s_!urDq!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png 1272w, /__u/substackcdn.com/image/fetch/$s_!urDq!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!urDq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png" width="1034" height="552" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:552,&quot;width&quot;:1034,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:185718,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://github.com/pwa-today/pwa-check&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/208333814?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!urDq!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png 424w, /__u/substackcdn.com/image/fetch/$s_!urDq!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png 848w, /__u/substackcdn.com/image/fetch/$s_!urDq!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png 1272w, /__u/substackcdn.com/image/fetch/$s_!urDq!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F284a4a39-8e73-46be-a16e-f314f7951692_1034x552.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Introducing pwa-check: An Automated PWA Health Check Tool]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/introducing-pwa-check-an-automated</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/introducing-pwa-check-an-automated</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Thu, 09 Jul 2026 12:41:02 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="5184" height="3456" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3456,&quot;width&quot;:5184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;person using laptop&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="person using laptop" title="person using laptop" srcset="https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1516321318423-f06f85e504b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y2hlY2t8ZW58MHx8fHwxNzgzNTExNTQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@johnishappysometimes">John</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/p/introducing-pwa-check-an-automated?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/modernwebweekly.substack.com/p/introducing-pwa-check-an-automated?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p><strong>Modern Web Weekly #76</strong></p><p>Is your web app actually ready to be installed, work offline, and behave like a <em>real</em> PWA?</p><p>Let <code>pwa-check</code><strong><span> </span></strong>answer that for you.</p><p>I created <code>pwa-check</code> to help you make sure your PWA looks, feels, and behaves like a real app.</p><p>You provide it the URL of the PWA you want to test and <code>pwa-check</code> scans the HTML, manifest, scripts, and service worker, then points straight at the gaps that will hurt installability or offline behavior.</p><p>Install it:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">npm i @pwa-today/pwa-check</code></pre></div><p> then run it using npx:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">npx pwa-check https://whatpwacando.today</code></pre></div><p> or, if you install it globally, directly:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">pwa-check https://whatpwacando.today</code></pre></div><p>It then does a thorough audit of your PWA to make sure it:</p><ul><li><p>meets the installability criteria</p></li><li><p>provides icons in all recommended sizes</p></li><li><p>provides screenshots with correct configuration and sizes for the enhanced installation dialog</p></li><li><p>provides other recommended members in its manifest, like <code>share_target</code>, <code>file_handlers</code>, <code>orientation</code>, <code>handle_links</code> and others</p></li><li><p>has a correct <code>viewport</code> meta tag</p></li><li><p>registers a service worker that caches assets and has the required event handlers</p></li><li><p>provides iOS and iPadOS startup images</p></li><li><p>follows other best practices </p></li></ul><p>You can use pwa-check as a standalone CLI tool or as part of your CI/CD pipeline. It returns a non-zero exit code on any failures, or you can make it fail on any warning by passing the <code>&#8212;-fail-on-warn</code> flag:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">pwa-check https://whatpwacando.today --fail-on-warn</code></pre></div><p>Use <code>&#8212;-json</code> for JSON output and <code>&#8212;-timeout &lt;ms&gt;</code> to put a timeout on each network request (like fetching icons and screenshots):</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">pwa-check https://whatpwacando.today --json --timeout 500</code></pre></div><p>I intend to add more checks in the future so give it a spin and let me know what you think or if it&#8217;s still missing something.</p><p>Check the <code>pwa-check</code> repo on <a href="https://github.com/pwa-today/pwa-check">GitHub</a>.</p><div><hr></div><h2>Safari Tech Preview 247 now ships an MCP server</h2><p>If you&#8217;re using AI in your coding workflow (and who doesn&#8217;t these days?), you can now ask your agent to run and debug web apps in Safari using the Safari MCP server.</p><p>The server is available in Safari Tech Preview 247 and can be enabled through Develop &gt; Developer Settings &gt; Allow remote automation and external agents.</p><p>If you use Codex, you can use the following command to add the Safari MCP server:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">codex mcp add safari-mcp-stp -- "/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver" --mcp</code></pre></div><p>For Claude, use:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">claude mcp add safari-mcp-stp -- "/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver" --mcp</code></pre></div><p>For other agents, add the following to <code>mcp.json</code> or <code>config.json</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">"safari-mcp-stp": {
  "command": "/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver",
  "args": ["--mcp"] 
}</code></pre></div><p>After this, you can prompt your agent to run your web app in Safari. For a list of currently available commands, check the <a href="https://webkit.org/blog/18136/introducing-the-safari-mcp-server-for-web-developers/">WebKit Blog article</a>.</p><div><hr></div><h2>New PWA installation dialog in Chrome 152</h2><p>Chrome 152 ships with some interesting changes to the web app installation dialog.</p><p>The first dialog now shows a &#8220;Learn More&#8221; button that links to a Google support page that explains PWAs and a &#8220;Next&#8221; button:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!jL0g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!jL0g!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png 424w, /__u/substackcdn.com/image/fetch/$s_!jL0g!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png 848w, /__u/substackcdn.com/image/fetch/$s_!jL0g!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png 1272w, /__u/substackcdn.com/image/fetch/$s_!jL0g!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!jL0g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png" width="450" height="499" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:499,&quot;width&quot;:450,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:130288,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/206034362?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!jL0g!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png 424w, /__u/substackcdn.com/image/fetch/$s_!jL0g!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png 848w, /__u/substackcdn.com/image/fetch/$s_!jL0g!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png 1272w, /__u/substackcdn.com/image/fetch/$s_!jL0g!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a32756b-69f4-43e0-a0f6-4c5fcf7e0c95_450x499.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you click the &#8220;Next&#8221; button, a second dialog is shown that illustrates where the web app will be installed (Chrome Canary Apps in this case), which is more aligned with the dialog that is shown when a native app is installed on macOS:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!pu2b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!pu2b!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png 424w, /__u/substackcdn.com/image/fetch/$s_!pu2b!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png 848w, /__u/substackcdn.com/image/fetch/$s_!pu2b!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png 1272w, /__u/substackcdn.com/image/fetch/$s_!pu2b!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!pu2b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png" width="450" height="283" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:283,&quot;width&quot;:450,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45413,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/206034362?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!pu2b!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png 424w, /__u/substackcdn.com/image/fetch/$s_!pu2b!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png 848w, /__u/substackcdn.com/image/fetch/$s_!pu2b!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png 1272w, /__u/substackcdn.com/image/fetch/$s_!pu2b!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8833fe2b-b5d1-4c41-81fd-320023cf2752_450x283.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>After the app is installed, a success dialog is displayed that contains an &#8220;Open tab in app&#8221; button to directly open the currently open browser tab in the installed PWA:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!7RIz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!7RIz!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png 424w, /__u/substackcdn.com/image/fetch/$s_!7RIz!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png 848w, /__u/substackcdn.com/image/fetch/$s_!7RIz!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7RIz!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!7RIz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png" width="450" height="197" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:197,&quot;width&quot;:450,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30296,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/206034362?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!7RIz!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png 424w, /__u/substackcdn.com/image/fetch/$s_!7RIz!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png 848w, /__u/substackcdn.com/image/fetch/$s_!7RIz!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7RIz!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2489544b-ad29-4403-94e4-661dd9c3cbe6_450x197.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Oh, and there&#8217;s more good stuff in Chrome 152&#8230;</p><div><hr></div><h2>PWA notification attribution on macOS</h2><p>If you have tested push notifications in an installed PWA on macOS, you probably noticed that the notifications contained a Chrome logo instead of the logo of the PWA:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!8AwI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!8AwI!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png 424w, /__u/substackcdn.com/image/fetch/$s_!8AwI!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png 848w, /__u/substackcdn.com/image/fetch/$s_!8AwI!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!8AwI!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!8AwI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png" width="738" height="254" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:254,&quot;width&quot;:738,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82942,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/206034362?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!8AwI!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png 424w, /__u/substackcdn.com/image/fetch/$s_!8AwI!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png 848w, /__u/substackcdn.com/image/fetch/$s_!8AwI!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!8AwI!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22aed3e7-809a-464c-9573-d94f9cde36d2_738x254.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Push notification on macOS, attributed to Chrome Canary instead of PWA</figcaption></figure></div><p>Starting in Chrome 152 on macOS, push notifications will be attributed to the PWA itself instead of Chrome. This means that if you include an icon in the push notification options, this will be shown instead of the Chrome logo:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Njxf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Njxf!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png 424w, /__u/substackcdn.com/image/fetch/$s_!Njxf!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png 848w, /__u/substackcdn.com/image/fetch/$s_!Njxf!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Njxf!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Njxf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png" width="738" height="254" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:254,&quot;width&quot;:738,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77659,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/206034362?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Njxf!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png 424w, /__u/substackcdn.com/image/fetch/$s_!Njxf!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png 848w, /__u/substackcdn.com/image/fetch/$s_!Njxf!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Njxf!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff61ef4-c081-44ef-a88b-0eb852e119ea_738x254.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Push notification on macOS, attributed to PWA</figcaption></figure></div><p>To set an icon, pass it in the <code>icon</code> key in the options for <code>showNotification()</code> in the <code>push</code> event handler:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">self.addEventListener('push', e =&gt; {
  e.waitUntil((async () =&gt; {
    const options = {
      body: 'Hi, this is a notification',
      icon: '/src/img/icons/icon-512x512.png',
      
      // other options
    };

    await self.registration.showNotification(title, options);

  })());
});</code></pre></div><p>This does introduce two behavioral changes on macOS for installed PWAs:</p><ul><li><p>the <code>requireInteraction</code> option for <code>showNotification</code> will no longer be supported, as on macOS, this is a per-app setting controlled by the user rather than a per-notification setting controlled by the app</p></li><li><p>the Badging API will now require separate permission</p></li></ul><p>For Chrome 152, you will need to use Chrome Canary at the time of writing, and you need to enable the Mac PWA notification attribution flag at <a href="http://chrome://flags/#enable-mac-pwas-notification-attribution">chrome://flags/#enable-mac-pwas-notification-attribution</a></p><p>When Chrome 152 is released, this will be enabled by default.</p><div><hr></div><div><hr></div><p style="text-align: center;">Do you need help with your web app?</p><p style="text-align: center;">Book a 1-on-1 call with me and I will do my absolute best to answer all your questions and solve your problems.</p><p style="text-align: center;">&#8364;100 for one hour, money-back guarantee if you&#8217;re not satisfied.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://cal.com/dannymoerkerke/1-on-1-consult-with-danny-moerkerke&quot;,&quot;text&quot;:&quot;Book a call now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://cal.com/dannymoerkerke/1-on-1-consult-with-danny-moerkerke"><span>Book a call now</span></a></p><div><hr></div><p style="text-align: center;"></p>]]></content:encoded></item><item><title><![CDATA[Indicate Unread Notifications With The Badging API]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/indicate-unread-notifications-with</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/indicate-unread-notifications-with</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Thu, 02 Jul 2026 15:19:22 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="5184" height="3888" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3888,&quot;width&quot;:5184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;green and white apple logo&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="green and white apple logo" title="green and white apple logo" srcset="https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1600960568458-7966d439289e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHx1bnJlYWQlMjBtZXNzYWdlc3xlbnwwfHx8fDE3ODI5MzQ5MzR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@brett_jordan">Brett Jordan</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/p/indicate-unread-notifications-with?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/modernwebweekly.substack.com/p/indicate-unread-notifications-with?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p><strong>Modern Web Weekly #75</strong></p><p><span>I updated my </span><a href="https://whatpwacando.today/notifications">push notifications demo</a><span>, which now shows a badge on the app icon with the number of unread push notifications using the Badging API.</span></p><p><span>This API is supported in Chrome, Edge, and Safari and is typically used in conjunction with the &#8220;push&#8221; event handler in a service worker. It consists of two methods on the </span><code>navigator</code><span> object, </span><code>setAppBadge</code><span> and </span><code>clearAppBadge</code><span>:</span></p><pre><code><code>// sets a badge with the number 3
navigator.setAppBadge(3)

// clears the badge
navigator.clearAppBadge()

// also clears the badge
navigator.setAppBadge(0)

// sets a badge with a dot
navigator.setAppBadge()</code></code></pre><p><span>Badges are typically shown when notifications are unread, and in </span><a href="https://whatpwacando.today/notifications">the demo of What PWA Can Do Today</a><span>, I chose to show badges when the PWA is not running:</span></p><p>When the PWA is opened and then moved to the background, the badge will be cleared on iOS. On Android, the badge can only be cleared when the notifications are clicked or cleared.</p><p>In the &#8220;push&#8221; event handler, I show the notification and then check if the service worker has active clients, which means apps that are not in the background or not running. If this is not the case, the badge is either set or, when it&#8217;s already shown, the number of unread notifications is incremented:</p><pre><code><code>e.waitUntil(
    self.registration.showNotification(title, options)
    .then(hasActiveClients)
    .then((activeClients) =&gt; {
      if(!activeClients) {
        updateBadges();
      }
    })</code></code></pre><p><span>Here&#8217;s the implementation of </span><code>hasActiveClients</code><span>:</span></p><pre><code><code>const hasActiveClients = async () =&gt; {
  const clients = await self.clients.matchAll({
    includeUncontrolled: true,
  });

  return clients.some(({visibilityState}) =&gt; 
    visibilityState === &#8216;visible&#8217;);
};</code></code></pre><p><span>The number of unread notifications is stored in IndexedDB and is updated in the </span><code>updateBadges</code><span> function:</span></p><pre><code><code>const updateBadges = async (inc = 1) =&gt; {

  // open the IndexedDB store
  const store = await openStore('badgeStore', &#8216;readwrite&#8217;);

  // get the number of unread notifications or 0 if not stored
  const result = await store.get(&#8217;num&#8217;) || {num: &#8216;num&#8217;, count: 0};
  
  // get the current number of unread notifications and increment it 
  // by the "inc" argument (1 if not given)
  const numBadges = result.count;
  const count = Math.max(0, numBadges + inc);

  // store the updated number
  await store.put({num: &#8216;num&#8217;, count});

  // set the badge number
  navigator.setAppBadge(count);
}</code></code></pre><p><span>For brevity, I omitted the implementation of </span><code>openStore</code><span>, but you can find it </span><a href="https://github.com/DannyMoerkerke/basic-service-worker/blob/main/service-worker.js">here</a><span>.</span></p><div><hr></div><h2>Using the native close mechanism with CloseWatcher</h2><p>Many UI components have some sort of &#8220;modal&#8221; or &#8220;popup&#8221; behavior, like <code>&lt;dialog&gt;</code>, a drawer or a context menu. Usually, these components are easy to close with the device&#8217;s native closing mechanism. On desktop, this is usually the <code>ESC</code> key, on Android, this is usually the Back button or swiping to the right from Android 10 on, on iOS with VoiceOver enabled, it&#8217;s the &#8220;z&#8221; key, and game consoles also provide specific buttons as their closing mechanism.</p><p>If you&#8217;ve ever tried to provide a uniform way for all these devices to close a UI component, you know this is tedious and complex to implement. You would first have to assert the type of device you&#8217;re dealing with and then select the appropriate action that would close the element. When new devices emerge, you&#8217;d have to add support for these as well, which makes this into a moving technical target that&#8217;s hard to hit.</p><p>Enter <code>CloseWatcher</code>.</p><p>This object abstracts the device-specific closing mechanisms away and provides a uniform API for web apps to respond to these closing actions. Whenever such an action is invoked (<code>ESC</code> key, Back button, etc.), <code>CloseWatcher</code> delivers a <code>cancel</code> event followed by a <code>close</code> event that web apps can listen for to close the UI component.</p><p>You can simply create a <code>CloseWatcher</code> and then listen for the <code>cancel</code> and <code>close</code> events:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const watcher = new CloseWatcher();

watcher.addEventListener('cancel', e =&gt; {
  // respond to the cancel event    
});

watcher.addEventListener('close', (e) =&gt; {
  // respond to the close event
});</code></pre></div><p>The <code>cancel</code> event gives a web app an opportunity to prevent the closing of the UI component based on some condition, for example, when the user has unsaved changes. By calling <code>e.preventDefault()</code>, the <code>close</code> event will not fire:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">watcher.addEventListener('cancel', e =&gt; {
  if(hasUnsavedChanges) {
    // prevent the close event from firing
    e.preventDefault();    
  }
});

watcher.addEventListener('close', (e) =&gt; {
  component.close();
});
</code></pre></div><p>It&#8217;s important to understand that the <code>CloseWatcher</code> instance is a one-off component; after the <code>close</code> event is fired, the watcher is destroyed. It also provides two methods to fire the events:</p><ul><li><p><code>close()</code>: fires the <code>close</code> event</p></li><li><p><code>requestClose()</code>: fires the <code>cancel</code> event and then the <code>close</code> event, unless <code>e.preventDefault()</code> was called in the <code>cancel</code> event</p></li></ul><p>For this reason, a new <code>CloseWatcher</code> needs to be created every time its <code>close</code> event was fired.</p><p>In the following example, we create a sidebar that is opened with a button. Inside its <code>click</code> handler, we instantiate a new <code>CloseWatcher</code> and listen for the <code>close</code> event to close the sidebar.</p><p>We also provide a button to close the sidebar. Inside the <code>click</code> handler for the close button, we call <code>requestClose()</code> so closing the sidebar always happens through the event handler for the <code>close</code> event:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const sidebar = document.querySelector('.sidebar');
const openButton = document.querySelector('.open-button');
const closeButton = document.querySelector('.close-button');

openButton.addEventListener('click', () =&gt; {
  // open the sidebar
  sidebar.classList.add('open');

  // create a new watcher
  const watcher = new CloseWatcher();
  
  // closes the sidebar when the close action is invoked
  watcher.addEventListener('close', (e) =&gt; {
    // close the sidebar
    sidebar.classList.remove('open');
  });

  // calls requestClose() so the cancel and close events are fired
  // this makes sure closing the sidebar only happens in one place: the event handler for
  // the close event
  closeButton.onclick = () =&gt; watcher.requestClose();
});</code></pre></div><p>We can now also add a handler for the <code>cancel</code> event to warn the user that there are unsaved changes and prevent the sidebar from closing. We can also add a save button that saves the changes and closes the sidebar. Inside its <code>click</code> handler, we call <code>close()</code> instead of <code>requestClose()</code> because we don&#8217;t need to fire the <code>cancel</code> event:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const sidebar = document.querySelector('.sidebar');
const openButton = document.querySelector('.open-button');
const closeButton = document.querySelector('.close-button');
const saveButton = document.querySelector('.save-button');

openButton.addEventListener('click', () =&gt; {
  // open the sidebar
  sidebar.classList.add('open');

  // create a new watcher
  const watcher = new CloseWatcher();
  
  
  watcher.addEventListener('cancel', e =&gt; {
    if(hasUnsavedChanges) {
      // prevents the close event from firing when there are unsaved changes
      e.preventDefault();
    }
  });

  // closes the sidebar when the close action is invoked
  watcher.addEventListener('close', (e) =&gt; {
    // close the sidebar
    sidebar.classList.remove('open');
  });

  // calls requestClose() so the cancel and close events are fired
  // this makes sure closing the sidebar only happens in one place: the event handler for
  // the close event
  closeButton.onclick = () =&gt; watcher.requestClose();

  // calls close() so only the close event is fired, cancel event is not needed
  // this makes sure closing the sidebar only happens in one place: the event handler for
  // the close event
  saveButton.onclick = () =&gt; {
    saveChanges();
    watcher.close();
  }
});</code></pre></div><p>Another important thing to know is that the <code>cancel</code> event can only be canceled <em>once</em>. This is to prevent abuse by trapping the user in not being able to close the sidebar. This means you can only alert the user once when there are unsaved changes. If you want to alert the user as long as there are unsaved changes, you&#8217;ll need to use another mechanism.</p><p>In one way, this is a bit unfortunate, but the restriction is understandable to prevent abuse.</p><p>Check out the <a href="https://codepen.io/dannymoerkerke/pen/LExyaRz">CloseWatcher demo</a>.</p><div><hr></div><div><hr></div><p style="text-align: center;">Do you need help with your web app?</p><p style="text-align: center;">Book a 1-on-1 call with me and I will do my absolute best to answer all your questions and solve your problems.</p><p style="text-align: center;">&#8364;100 for one hour, money-back guarantee if you&#8217;re not satisfied.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://cal.com/dannymoerkerke/1-on-1-consult-with-danny-moerkerke&quot;,&quot;text&quot;:&quot;Book a call now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://cal.com/dannymoerkerke/1-on-1-consult-with-danny-moerkerke"><span>Book a call now</span></a></p><div><hr></div><p style="text-align: center;"></p>]]></content:encoded></item><item><title><![CDATA[Out-of-Order Streaming HTML Is Coming To A Browser Near You]]></title><description><![CDATA[The modern web, tested and explain in plain English]]></description><link>https://modernwebweekly.substack.com/p/out-of-order-streaming-html-is-coming</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/out-of-order-streaming-html-is-coming</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Fri, 05 Jun 2026 12:55:33 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="4507" height="3004" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3004,&quot;width&quot;:4507,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a bunch of blue wires connected to each other&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a bunch of blue wires connected to each other" title="a bunch of blue wires connected to each other" srcset="https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1683322499436-f4383dd59f5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMnx8bmV0d29ya3xlbnwwfHx8fDE3ODAzOTgxNjl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@scottrodgerson">Scott Rodgerson</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/p/out-of-order-streaming-html-is-coming?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/modernwebweekly.substack.com/p/out-of-order-streaming-html-is-coming?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p><strong>Modern Web Weekly #74</strong></p><p>Did you ever wish you could serve some parts of your HTML earlier or later than others? </p><p>Imagine your web app has a large dropdown menu at the top of the page. Since HTML is delivered in a top-to-bottom fashion, the HTML after this menu won&#8217;t be available until the HTML for the menu is downloaded and parsed, but the user won&#8217;t be able to use the menu until the page becomes interactive. The menu HTML might as well be delivered later so the rest of the page is available sooner.</p><p>Or how about a single-page app with a page shell. This shell is delivered in the first request, and then JavaScript is needed to plug in all other HTML.</p><p>Wouldn&#8217;t it be nice if you could do this in one request and choose the order in which the HTML parts are delivered, regardless of their order in the source document?</p><p>Well, now you can! &#128170;</p><h4>Out-of-order streaming HTML</h4><p>There have already been <a href="https://lamplightdev.com/blog/2024/01/10/streaming-html-out-of-order-without-javascript/">some experiments</a> with out-of-order streaming HTML that use Declarative Shadow DOM and <code>&lt;slot&gt;</code> elements to stream HTML out of order:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;div&gt;
  &lt;template shadowrootmode="open"&gt;
    &lt;header&gt;Header&lt;/header&gt;
    &lt;main&gt;
      &lt;slot name="content"&gt;&lt;/slot&gt;
    &lt;/main&gt;
    &lt;footer&gt;Footer&lt;/footer&gt;
  &lt;/template&gt;

  &lt;div slot="content"&gt;
    This div will be rendered inside the slot above without JavaScript.
  &lt;/div&gt;
&lt;/div&gt;</code></pre></div><p>In the above example, <code>&lt;slot name=&#8221;content&#8221;&gt;&lt;/slot&gt;</code> will be replaced with  <code>&lt;div slot=&#8221;content&#8221;&gt;</code> as soon as it&#8217;s available in the browser, without any JavaScript.</p><p>This is a very neat feature, but it only works with Shadow DOM.</p><p>In Chrome 148, with experimental web features enabled (visit chrome://flags/#enable-experimental-web-platform-features), you can now use <a href="https://github.com/WICG/declarative-partial-updates">Declarative Partial Updates</a> that enable web apps to stream HTML into parts of the document, regardless of the order in which it&#8217;s delivered by the server. </p><p>For example, web apps can now download the most important HTML first, even when this is not at the top of the HTML document.</p><h4>How it works</h4><p>Streaming out-of-order HTML is called &#8220;patching&#8221;. It means you can interleave content for multiple locations in an HTML document in one HTML stream, and the content doesn&#8217;t have to be streamed in the order in which it&#8217;s located in the document, hence &#8220;out-of-order streaming&#8221;. </p><p>It works by putting <strong>processing instructions</strong> in an HTML document that function as the insertion points where the content will be streamed into:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;div&gt;
  &lt;?marker name="content"&gt;
&lt;/div&gt;

&lt;template for="content"&gt;
  &lt;p&gt;Here is the content that will be inserted.&lt;/p&gt;
&lt;/template&gt;</code></pre></div><p>In the above example, the processing instruction <code>&lt;?marker name=&#8221;content&#8221;&gt;</code> will be replaced with the contents of the <code>&lt;template&gt;</code>.</p><p>The template will look up the processing instruction with a <code>name</code> attribute that corresponds to its <code>for</code> attribute and replace it with its contents.</p><p>The above example will end up like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;div&gt;
  &lt;p&gt;Here is the content that will be inserted.&lt;/p&gt;
&lt;/div&gt;</code></pre></div><p>In addition to <code>&lt;?marker&gt;</code>, you can also use the <code>&lt;?start&gt;</code> and <code>&lt;?end&gt;</code> markers that enable you to add temporary content that will be displayed until it&#8217;s replaced with the contents of the corresponding <code>&lt;template&gt;</code> element:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;div&gt;
  &lt;?start name="list"&gt;
  Loading&#8230;
  &lt;?end&gt;
&lt;/div&gt;

...

&lt;template for="list"&gt;
  &lt;ul&gt;
    &lt;li&gt;Item 1&lt;/li&gt;
    &lt;li&gt;Item 2&lt;/li&gt;
    &lt;li&gt;Item 3&lt;/li&gt;
  &lt;/ul&gt;
&lt;/template&gt;</code></pre></div><p>In this example, &#8220;Loading&#8230;&#8221; is displayed inside the <code>&lt;div&gt;</code> until it&#8217;s replaced with the list inside the <code>&lt;template&gt;</code> element.</p><p>This would enable you to first stream a skeleton HTML page with a loading screen, and after that you could append the list HTML, which is maybe fetched from an external API that takes longer to load.</p><p>Normally, you would first serve the app shell, then fetch the list with the API data in a separate request, and then use JavaScript to insert the list HTML. With patching, you can do everything in a single HTML response without having to use JavaScript to insert the list.</p><p>You can even add processing instructions in the templates to enable updates in multiple steps. Imagine that the list in the previous example is loaded in chunks instead of fully in one request. By including processing instructions in the templates, you can now continuously update the list:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;div&gt;
  &lt;?start name="list"&gt;
  Loading&#8230;
  &lt;?end&gt;
&lt;/div&gt;

...

&lt;template for="list"&gt;
  &lt;ul&gt;
    &lt;li&gt;Item 1&lt;/li&gt;
    &lt;?marker name="items"&gt;
  &lt;/ul&gt;
&lt;/template&gt;

&lt;template for="items"&gt;
  &lt;li&gt;Item 2&lt;/li&gt;
  &lt;li&gt;Item 3&lt;/li&gt;
  &lt;?marker name="items"&gt;
&lt;/template&gt;

&lt;template for="items"&gt;
  &lt;li&gt;Item 4&lt;/li&gt;
  &lt;?marker name="items"&gt;
&lt;/template&gt;</code></pre></div><p>This results in the following HTML:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;div&gt;
  &lt;ul&gt;
    &lt;li&gt;Item 1&lt;/li&gt;
    &lt;li&gt;Item 2&lt;/li&gt;
    &lt;li&gt;Item 3&lt;/li&gt;
    &lt;li&gt;Item 4&lt;/li&gt;
    &lt;?marker name="items"&gt;
  &lt;/ul&gt;
&lt;/div&gt;</code></pre></div><p>This is huuuuge&#8230;</p><p>&#8230;and there&#8217;s even more&#8230;</p><h4>Streaming HTML in single-page apps</h4><p>Single-page apps (SPA) have long been the solution to make web apps feel like real apps, because they only update the changed content when the user navigates to another page, without a full page reload.</p><p>The downside of this is that SPAs can&#8217;t use <a href="https://instantmultipageapp.com">the browser&#8217;s streaming parser</a>. When a browser loads a web page, it can do so in a streaming fashion. This means that it can already start rendering the page while it&#8217;s still downloading; it doesn&#8217;t have to wait for the page to be fully loaded before it can start rendering content.</p><p>SPAs typically load a skeleton HTML page and then update the content with DOM manipulation using JavaScript. Any content that is inserted into the DOM after the page has been served by the server cannot use the browser&#8217;s streaming parser. It has to wait for all content to be ready before it can start to render it when it&#8217;s inserted using JavaScript (for example, with <code>innerHTML</code>).</p><p>Until now&#8230;</p><h4>New streaming methods</h4><p>In addition to existing methods like <code>setHTML</code>, <code>setHTMLUnsafe</code> and the <code>innerHTML</code> and <code>outerHTML</code> setters, this proposal adds streaming methods like <code>streamHTML</code>, <code>streamHTMLUnsafe</code>, <code>streamAppendHTML</code> etc.</p><p>This enables SPAs to <em>stream</em> HTML into the insertion points marked by processing instructions <em>using JavaScript</em>. This means that instead of using <code>innerHTML</code> to update content, your SPA can now do this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const response = await fetch('/path/to/content.html');
const html = await response.text();

const writer = document.body.streamAppendHTMLUnsafe().getWriter();

await writer.write(html);
await writer.close();</code></pre></div><p>Note that in this example, the content is added to the <code>&lt;body&gt;</code> element.</p><p>When you use <code>&lt;template&gt;</code> elements and markers, you don&#8217;t even need to get a reference to the insertion point with JavaScript anymore. You can just define the insertion point of the SPA content with a marker:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;main id="app"&gt;
  &lt;section class="page"&gt;
    &lt;?marker name="content"&gt;
  &lt;/section&gt;
&lt;/main&gt;</code></pre></div><p>And then you can simply append the <code>&lt;template&gt;</code> to the bottom of the page:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;template for="content"&gt;
&lt;?start name="content"&gt;
  &lt;p&gt;Homepage content&lt;/p&gt;
&lt;?end&gt;
&lt;/template&gt;</code></pre></div><p>Since you defined a marker and added this template to the bottom of the page, the browser will now take care of inserting the content in the right place. Also note that this template contains <code>&lt;?start&gt;</code> and <code>&lt;?end&gt;</code> markers, and the resulting HTML will be this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;html&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-html">&lt;main id="app"&gt;
  &lt;section class="page"&gt;
    &lt;?start name="content"&gt;
      &lt;p&gt;Homepage content&lt;/p&gt;
    &lt;?end&gt;
  &lt;/section&gt;
&lt;/main&gt;</code></pre></div><p>This ensures that the processing instructions are ready for when the user navigates to another page. If each partial contains these processing instructions, you can always just add the page HTML to the bottom of the page, and the browser will then insert it in the right location while replacing the contents of the previous page.</p><p>And there&#8217;s even more good news&#8230;</p><h4>Cross-browser support is coming soon</h4><p>Not only can you already use this in Chromium-based browsers from version 148 with experimental web features enabled, but the WebKit team (Safari) has <a href="https://github.com/WebKit/standards-positions/issues/628">announced</a> they will support this and the Firefox team has a <a href="https://github.com/mozilla/standards-positions/issues/1369">positive position</a> on this feature.</p><p>This means this feature could be supported in all major browsers soon! &#128170;</p><h4>Demo</h4><p>I created a demo SPA that uses the technique described above to update the page content. It defines markers in the HTML where the page content is to be inserted, and each page partial HTML template contains new markers where the content of the next page is to be inserted. All page templates are simply added to the bottom of the page, and the browser takes care of the rest.</p><p>Check out the <a href="https://streaming-spa.vercel.app/">demo</a> and the <a href="https://github.com/DannyMoerkerke/streaming-spa">source code</a>.</p><p>Notice that the demo uses the <code>streamAppendHTMLUnsafe()</code> method to stream the content. The Unsafe variant is required to preserve the &lt;template&gt; element in the HTML that is inserted. Using <code>streamAppendHTML()</code>results in empty HTML and doesn&#8217;t work.</p><p>Also notice that the streaming methods are required to use templates and markers. When you use non-streaming methods, like <code>appendHTMLUnsafe()</code> for example, the parent of the template when it is parsed is an intermediate document fragment, and the patching happens "in place" inside the fragment instead of in the insertion point indicated by the markers.</p><p>The /list route of the demo demonstrates a list that is updated in chunks. The demo just uses <code>setTimeout()</code> to simulate a response that delivers the chunks, but you can probably imagine how this would work in a production scenario where the content is delivered in real chunks.</p><p>Also make sure to check out the <a href="https://developer.chrome.com/blog/declarative-partial-updates">Chrome developers article</a> and the <a href="https://github.com/GoogleChromeLabs/web-perf-demos/blob/main/patching-demos/photo-album-server.js">accompanying demo</a>, which demonstrates the out-of-order streaming very well. </p><p>This is a very promising feature that will truly revolutionize how HTML is delivered. When more browsers support this, you will hear it here first!</p><div><hr></div><p style="text-align: center;">Do you need help with your web app?</p><p style="text-align: center;">Book a 1-on-1 call with me and I will do my absolute best to answer all your questions and solve your problems.</p><p style="text-align: center;">&#8364;100 for one hour, money-back guarantee if you&#8217;re not satisfied.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://cal.com/dannymoerkerke/1-on-1-consult-with-danny-moerkerke&quot;,&quot;text&quot;:&quot;Book a call now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://cal.com/dannymoerkerke/1-on-1-consult-with-danny-moerkerke"><span>Book a call now</span></a></p><div><hr></div><p style="text-align: center;"></p>]]></content:encoded></item><item><title><![CDATA[File System Access And Persistent Storage For Web Apps]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/file-system-access-and-persistent</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/file-system-access-and-persistent</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Thu, 28 May 2026 13:46:36 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="6016" height="4000" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4000,&quot;width&quot;:6016,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a group of electronic devices&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a group of electronic devices" title="a group of electronic devices" srcset="https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1652195019227-4f3d3f599959?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOHx8ZGlza3xlbnwwfHx8fDE3Nzk5NzQ5NDR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@sjjillan">s j</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/p/file-system-access-and-persistent?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/modernwebweekly.substack.com/p/file-system-access-and-persistent?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><h4>Modern Web Weekly #73</h4><p>The File System Access API brings access to the native file system to web apps. The API is currently only supported in Chromium-based browsers on desktop, but the Origin Private File System is now supported across all browsers on desktop, Android, and iOS.</p><p>The Origin Private File System (OPFS) is a high-perfor&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/file-system-access-and-persistent">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[A Picture-in-Picture window with arbitrary HTML]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/a-picture-in-picture-window-with</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/a-picture-in-picture-window-with</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Thu, 21 May 2026 13:47:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Gmdx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Gmdx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Gmdx!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png 424w, /__u/substackcdn.com/image/fetch/$s_!Gmdx!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png 848w, /__u/substackcdn.com/image/fetch/$s_!Gmdx!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Gmdx!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Gmdx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Gmdx!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png 424w, /__u/substackcdn.com/image/fetch/$s_!Gmdx!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png 848w, /__u/substackcdn.com/image/fetch/$s_!Gmdx!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Gmdx!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c3fe1a-1962-47fe-a0a2-78ade62092a2_1024x608.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/p/a-picture-in-picture-window-with?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/modernwebweekly.substack.com/p/a-picture-in-picture-window-with?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p><strong>Modern Web Weekly #72</strong></p><p>Firefox 151 now supports the Document Picture-in-Picture API after support already landed in Chromium-based browsers last year.</p><p>The Document Picture-in-Picture API enables web apps to populate a picture-in-picture window with arbitrary HTML content. This means that you can place custom controls to control a video in a picture-in-pict&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/a-picture-in-picture-window-with">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Bullet-proof encryption for web apps]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/bullet-proof-encryption-for-web-apps</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/bullet-proof-encryption-for-web-apps</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Thu, 07 May 2026 12:32:31 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="5616" height="2940" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2940,&quot;width&quot;:5616,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a computer keyboard with a padlock on top of it&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a computer keyboard with a padlock on top of it" title="a computer keyboard with a padlock on top of it" srcset="https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1654588831193-0285dab84d5a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Nnx8ZW5jcnlwdGlvbnxlbnwwfHx8fDE3Nzc5ODgxMjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@sasun1990">Sasun Bughdaryan</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/p/bullet-proof-encryption-for-web-apps?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/modernwebweekly.substack.com/p/bullet-proof-encryption-for-web-apps?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><h4>Modern Web Weekly #71</h4><p>If you want to use encryption in your web app to encrypt and decrypt sensitive data, you can use the Web Crypto API to generate an public and private key:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const { publicKey, privateKey } = await window.crypto.subtle.generateKey(
  {
    name: "RSA-OAEP",
    modulusLength: 4096,
    publicExponent&#8230;</code></pre></div>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/bullet-proof-encryption-for-web-apps">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #70]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-70</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-70</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Thu, 30 Apr 2026 11:04:47 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="3000" height="2143" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2143,&quot;width&quot;:3000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;text&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="text" title="text" srcset="https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1665470909939-959569b20021?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyMTF8fHBvcHVwfGVufDB8fHx8MTc3NzU0Njg5Nnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@mediamodifier">Mediamodifier</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h2>Safari Tech Preview now supports the improved attr() function</h2><p>After Chrome, Safari Tech Preview 241 now also supports the improved <code>attr()</code> function. This function can read any attribute from the element it&#8217;s applied to. Using its output however, was limited to the CSS <code>content</code> attribute, but now you can use it in conjuncti&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-70">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #69]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-69</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-69</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Fri, 20 Mar 2026 15:57:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Nguk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Nguk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Nguk!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Nguk!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Nguk!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Nguk!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Nguk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic" width="1200" height="675" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:675,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:14896,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/190109649?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Nguk!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Nguk!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Nguk!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Nguk!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F272b2b84-6440-4a5d-b06b-576930b578ba_1200x675.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>How to install a PWA with Samsung Internet Browser</h2><p>I found <a href="https://www.reddit.com/r/PWA/comments/1ruvnl9/anybody_having_issues_installing_pwas_from/">a report on Reddit</a> this week that pointed to issues with installing PWAs through Samsung Internet Browser on Android.</p><p>Some PWAs were flagged as &#8220;unsafe&#8221; by Google Play Protect, and others, including my What PWA Can Do Today, simply failed silently when trying to install. In that case, a message wo&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-69">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #68]]></title><description><![CDATA[The Modern Web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-68</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-68</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Fri, 06 Mar 2026 14:44:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PpF5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!PpF5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!PpF5!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic 424w, /__u/substackcdn.com/image/fetch/$s_!PpF5!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic 848w, /__u/substackcdn.com/image/fetch/$s_!PpF5!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!PpF5!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!PpF5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic" width="528" height="385" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:385,&quot;width&quot;:528,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8756,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/188487600?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!PpF5!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic 424w, /__u/substackcdn.com/image/fetch/$s_!PpF5!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic 848w, /__u/substackcdn.com/image/fetch/$s_!PpF5!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!PpF5!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3f4b6d-2757-44ea-bd8f-f025e7b59524_528x385.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Customisable &lt;select&gt; now in Safari Tech Preview 238</h2><p>After Chrome, Safari has now also implemented the fully customisable <code>&lt;select&gt;</code> element in Tech Preview 238. This means we can now fully style this element, which was barely possible before.</p><p>To opt-in to the new customizable <code>&lt;select&gt;</code> add this to your CSS:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;css&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-css">select,
::picker(select) {
  appearance: base-selec&#8230;</code></pre></div>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-68">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #67]]></title><description><![CDATA[The modern web, tested and explain in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-67</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-67</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Thu, 19 Feb 2026 15:33:03 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="4500" height="3000" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3000,&quot;width&quot;:4500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a white square with a red circle on top of it&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a white square with a red circle on top of it" title="a white square with a red circle on top of it" srcset="https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1685381949388-bb0402fbe133?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxub3RpZmljYXRpb258ZW58MHx8fHwxNzcxNDI3MjY4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@philipsfuture">Philip Oroni</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h2>A declarative install element</h2><p>In Modern Web Weekly <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-65">#65</a> and <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-59">#59</a>, I wrote about the Web Install API (now stable in Chrome 144!) that adds the <code>install</code> method to <code>navigator</code> and that enables web apps to be installed as PWAs, also from other domains.</p><p>Chrome 147 now also introduces an origin trial for the declarative <code>&lt;install&gt;</code> ele&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-67">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #66 ]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-66</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-66</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Thu, 05 Feb 2026 15:13:43 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="3031" height="2006" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2006,&quot;width&quot;:3031,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;photo of red and blue zippers&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="photo of red and blue zippers" title="photo of red and blue zippers" srcset="https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1531376653594-e9bcf0f0c65b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMXx8Y29tcHJlc3Npb258ZW58MHx8fHwxNzY4NDk3Mzc1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@tomas_nz">Tomas Sobek</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><div class="pullquote"><p>It&#8217;s been a while, but after an extended break, Modern Web Weekly is now back! &#127881;</p></div><h2>Can I compress it? Yes, you can!</h2><p>If your web app needs to compress and decompress data, you no longer need an external library. The Compression Streams API is now available in all browsers and enables your app to (de)compress data using GZIP a&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-66">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #65]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-65</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-65</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Fri, 21 Nov 2025 12:56:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qUUR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!qUUR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!qUUR!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!qUUR!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!qUUR!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!qUUR!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!qUUR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:246556,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/178875756?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!qUUR!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!qUUR!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!qUUR!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!qUUR!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a89c2c4-fb4b-4915-a478-bd39e93d12bb_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Web Install API now in Chrome 143</h2><p>Chrome 143 now supports the Web Install API as an origin trial.</p><p>This API provides a declarative way of installing web apps through <code>navigator.install()</code>.</p><p>When it&#8217;s called without arguments, it installs the current web app (the one on the domain where this method is called from:</p><pre><code>// installs the current web app
navigator.instal&#8230;</code></pre>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-65">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #64]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-64</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-64</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Fri, 14 Nov 2025 11:26:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JZLb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!JZLb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!JZLb!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png 424w, /__u/substackcdn.com/image/fetch/$s_!JZLb!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png 848w, /__u/substackcdn.com/image/fetch/$s_!JZLb!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png 1272w, /__u/substackcdn.com/image/fetch/$s_!JZLb!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!JZLb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!JZLb!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png 424w, /__u/substackcdn.com/image/fetch/$s_!JZLb!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png 848w, /__u/substackcdn.com/image/fetch/$s_!JZLb!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png 1272w, /__u/substackcdn.com/image/fetch/$s_!JZLb!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7cc23cd-e0b9-4b47-a1c7-14732e2f9ef8_1024x608.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Better drag-and-drop with Observer</h2><p>If you&#8217;ve ever built drag-and-drop functionality, you know that this can be tricky to implement and can result in brittle code that&#8217;s hard to follow.</p><p>You need to implement a handler for the <code>mousemove</code> event, but this handler should only be called when it&#8217;s preceded by a <code>mousedown</code> event on the element that needs to be drag&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-64">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #63]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-63</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-63</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Wed, 05 Nov 2025 13:58:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HbFY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!HbFY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!HbFY!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic 424w, /__u/substackcdn.com/image/fetch/$s_!HbFY!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic 848w, /__u/substackcdn.com/image/fetch/$s_!HbFY!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!HbFY!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!HbFY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic" width="1020" height="579" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:579,&quot;width&quot;:1020,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40008,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/177501059?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!HbFY!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic 424w, /__u/substackcdn.com/image/fetch/$s_!HbFY!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic 848w, /__u/substackcdn.com/image/fetch/$s_!HbFY!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!HbFY!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa441e48f-aa06-47a0-a6c4-fa274fbd82b1_1020x579.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>CMA designates Apple as having Strategic Market Status</h2><p>The Open Web Advocacy (OWA) reports that the UK&#8217;s Competition and Markets Authority (CMA) has officially designated Apple as having Strategic Market Status (SMS).</p><p>SMS means that Apple &#8220;has substantial and entrenched market power and a position of strategic significance&#8221;. It means that Apple&#8217;s iOS plat&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-63">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #62]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-62</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-62</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Fri, 24 Oct 2025 08:40:45 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="4402" height="2880" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2880,&quot;width&quot;:4402,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;person holding black iphone 7&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="person holding black iphone 7" title="person holding black iphone 7" srcset="https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1585060282215-39a72f82385c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2MXx8YXBwfGVufDB8fHx8MTc2MTI5NDg2MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@vojtechbruzek">Vojtech Bruzek</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h2><strong>What We Need To Make Web Apps A Success</strong></h2><p>We don&#8217;t need to wait for Apple to jump on board</p><p>Here&#8217;s a fun experiment: put your phone in flight mode so there&#8217;s no internet connection, and make sure it&#8217;s not connected to wifi either.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Modern Web Weekly is a reader-supported publication. To receive new posts and support my work, &#8230;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-62">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #61]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-61</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-61</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Thu, 16 Oct 2025 12:46:22 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="5472" height="3648" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3648,&quot;width&quot;:5472,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;selective focus photography of person using smartphone&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="selective focus photography of person using smartphone" title="selective focus photography of person using smartphone" srcset="https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1526045612212-70caf35c14df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxtZXNzYWdlfGVufDB8fHx8MTc2MDYxNjM3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@freestocks">freestocks</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h2>Taming the on-screen keyboard with <code>interactive-widget</code></h2><p>In Chromium-based browsers, you can now control how the layout of the page behaves when the on-screen keyboard is shown on mobile devices.</p><p>Different browsers behave differently when the on-screen keyboard is shown. They can resize the <em>Layout Viewport</em>, the <em>Visual Viewport</em>,&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-61">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #60]]></title><description><![CDATA[The modern web, tested and explained in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-60</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-60</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Fri, 03 Oct 2025 13:05:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vX-I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!vX-I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!vX-I!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic 424w, /__u/substackcdn.com/image/fetch/$s_!vX-I!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic 848w, /__u/substackcdn.com/image/fetch/$s_!vX-I!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!vX-I!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_webp, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!vX-I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic" width="500" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38495,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://modernwebweekly.substack.com/i/173932347?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!vX-I!, /__u/modernwebweekly.substack.com/w_424, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic 424w, /__u/substackcdn.com/image/fetch/$s_!vX-I!, /__u/modernwebweekly.substack.com/w_848, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic 848w, /__u/substackcdn.com/image/fetch/$s_!vX-I!, /__u/modernwebweekly.substack.com/w_1272, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!vX-I!, /__u/modernwebweekly.substack.com/w_1456, /__u/modernwebweekly.substack.com/c_limit, /__u/modernwebweekly.substack.com/f_auto, /__u/modernwebweekly.substack.com/q_auto:good, /__u/modernwebweekly.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7495230-c5fa-40c4-874c-e417b970ccb5_500x500.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>iOS 26 for PWAs: The Good, the Bad, and the Ugly</h2><p>iOS 26 has arrived, and of course, I combed through the release notes and did a lot of testing to see what has changed for PWA support.</p><p>In short, there is unfortunately not too much to be excited about, but let&#8217;s start with the good news.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://modernwebweekly.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Modern Web Weekly is a reader-supported publication. To receive new po&#8230;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-60">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Modern Web Weekly #59]]></title><description><![CDATA[The modern web, tested and explain in plain English]]></description><link>https://modernwebweekly.substack.com/p/modern-web-weekly-59</link><guid isPermaLink="false">https://modernwebweekly.substack.com/p/modern-web-weekly-59</guid><dc:creator><![CDATA[Danny Moerkerke]]></dc:creator><pubDate>Mon, 21 Jul 2025 14:19:55 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="4608" height="3072" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3072,&quot;width&quot;:4608,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;space gray iPhone 6 turned on on marble surface&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="space gray iPhone 6 turned on on marble surface" title="space gray iPhone 6 turned on on marble surface" srcset="https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1565263965454-a44e2ede252a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5OXx8aW5zdGFsbCUyMGFwcHxlbnwwfHx8fDE3NTI3NDk1MjN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="/__u/modernwebweekly.substack.com/true">Maccy</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h2>Install your PWA from anywhere</h2><p>The dev trial for Microsoft&#8217;s proposal for the <a href="https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/WebInstall/explainer.md">Web Install UI</a> is now live.</p><p>This API adds the <code>install</code> method to <code>navigator</code> to install a web app on the user&#8217;s device. When <code>navigator.install()</code> is called without any arguments, the browser will prompt to install the current web app, meaning the web app ho&#8230;</p>
      <p>
          <a href="/__u/modernwebweekly.substack.com/p/modern-web-weekly-59">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>