<?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:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Alex Russell on Medium]]></title>
        <description><![CDATA[Stories by Alex Russell on Medium]]></description>
        <link>https://medium.com/@slightlylate?source=rss-fa63e1e8071------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*TGNVWGuXk0JzjUzz4T3RXg.jpeg</url>
            <title>Stories by Alex Russell on Medium</title>
            <link>https://medium.com/@slightlylate?source=rss-fa63e1e8071------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 07:00:57 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@slightlylate/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Why Are App Install Banners Still A Thing?]]></title>
            <link>https://medium.com/dev-channel/why-are-app-install-banners-still-a-thing-18f3952d349a?source=rss-fa63e1e8071------2</link>
            <guid isPermaLink="false">https://medium.com/p/18f3952d349a</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[progressive-web-app]]></category>
            <dc:creator><![CDATA[Alex Russell]]></dc:creator>
            <pubDate>Thu, 04 May 2017 18:38:04 GMT</pubDate>
            <atom:updated>2017-05-08T18:40:39.528Z</atom:updated>
            <content:encoded><![CDATA[<p><strong><em>A tweetstorm digestion by </em></strong><a href="https://twitter.com/slightlylate"><strong><em>Alex</em></strong></a><strong><em> &amp; </em></strong><a href="https://twitter.com/owencm"><strong><em>Owen</em></strong></a><strong><em>.</em></strong></p><p>“<em>Why would someone add this banner to their website?!</em>” asks <a href="https://medium.com/u/c2890cdd7a64">Ada Rose Edwards</a>:</p><h3>Ada Rose 🏳️‍🌈✊🏾🌍 on Twitter</h3><p>Why would someone add this banner to their website?! Embrace the web it is good. Tumblr web is great.</p><p>That question <a href="https://twitter.com/slightlylate/status/850654566706106369">spawned a ~40 tweet conversation</a> that some folks <a href="https://twitter.com/demakase86">asked</a> to see written up here.</p><p>Before we get to that, and by way of disclaimer, we don’t have any insight into the specific thinking of the Tumblr team. For all we know they’ve done all the experiments and found the native app a better investment. It’s possible! Regardless, the past few years of working with teams that are at various points on a journey towards <a href="https://medium.com/@slightlylate/progressive-apps-escaping-tabs-without-losing-our-soul-3b93a8561955">Progressive Web Apps</a> has uncovered some patterns and it seems as likely as not that Tumblr is on a similar journey (whether or not they know it).</p><p>So why <em>do</em> sites add banners like these? The short answer is growth. The desired form of growth might be increased loyalty, engagement, or use. Sometimes it’s user-base growth, although that instinct has waned among savvy product managers now that <a href="http://www.theverge.com/2016/3/2/11140928/app-store-economy-apple-android-pixite-bankruptcy">the App Store gold rush has definitively ended</a>. This sort of desired deeper engagement gets phrased in many ways: “<em>a better experience</em>”, “<em>faster</em>”, “<em>keeps you up to date</em>” (code for <a href="https://developers.google.com/web/fundamentals/engage-and-retain/push-notifications/">push notifications</a>), etc.</p><p>Engagement and recall are valuable commodities in an attention economy. The platform wars that have followed are a result. Product owners and managers often view their websites (if they have them) as the “top of the <a href="https://en.wikipedia.org/wiki/Purchase_funnel">funnel</a>”; a way to build awareness of the final product or provide a try-before-you-buy version of the “real” experience.</p><p>This makes sense, historically speaking. Until <a href="https://medium.com/@slightlylate/progressive-apps-escaping-tabs-without-losing-our-soul-3b93a8561955">Progressive Web Apps</a> arrived, it wasn’t possible to engage users who wanted more of a service in all the ways that native apps could. The lack of <a href="https://developers.google.com/web/fundamentals/engage-and-retain/push-notifications/">push notifications</a> and a <a href="https://developers.google.com/web/fundamentals/engage-and-retain/app-install-banners/">presence on the homescreen</a> stunted engagement. Lack of <a href="https://developers.google.com/web/fundamentals/getting-started/primers/service-workers">meaningful offline behavior</a> meant it was natural for services and users to choose the native app route once they decided a service was worthwhile.</p><p>The trajectory of many businesses adapting to mobile looked like this:</p><ol><li>Pretend their desktop website is fine because pinch/zoom</li><li>Invest in “responsive” without slimming down JS, ad, image, or third-party content — or worse, adopt services that “adapt” existing sites using blocking script tags.</li><li>When that (inevitably) doesn’t work, experiment with native apps</li><li>Early numbers from native apps look good, particularly regarding engagement vs. bad mobile web experience</li><li>ALL IN ON NATIVE!!!!</li><li>Discover the distribution wall: it’s blindingly expensive to drive native app installs if you aren’t #1 in your market</li><li>Investigate modern mobile web options</li></ol><p>We tend to work with teams who are at steps 6 or 7; any earlier than that and the conventional wisdom makes it nearly impossible to get traction. The conventional wisdom is strong for a few reasons:</p><ul><li>“<em>Market leaders have native apps and it’s working for them, so why not us?</em>”</li><li>Early engagement numbers from native apps <em>are</em> strong</li><li>Structural challenges to learning that native apps aren’t working</li><li>Android blindness</li></ul><p>Ignoring the false equivalence between not-Facebook (everyone, basically) and Facebook (who can afford to develop infinite versions of a service to reach a marginally larger audiences and leverage existing installed base to drive cheap installs), services that experiment with native apps <em>do</em> tend to see increased engagement vs. “responsive web” sites. This follows from the historical feature gap but also from a more subtle effect: users who are willing to sit through a native app download, install, and ongoing update tax <em>are likely to already be heavily engaged with a service</em>.</p><p>Unless product managers are unusually scrupulous in segmenting and tracking which users adopt native apps, the prompts and overlays (like the one <a href="https://medium.com/u/c2890cdd7a64">Ada Rose Edwards</a> flagged) can simply be zero-sum transfers of engaged users from one version of a service to another. Even rarer are true A/B comparisons: funding both PWA and native app development and comparing engagement between them.</p><p>Teams we’ve worked with have reported similar engagement between those who install PWAs and those who install native apps, but the friction of PWA installation is <em>much</em> lower. Our internal metrics at Google show that for similar volume of prompting for <a href="https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android">PWA banners</a> and <a href="https://developers.google.com/web/fundamentals/engage-and-retain/app-install-banners/#native_app_install_banners">native app banners</a> — the closest thing to an apples-to-apples comparison we can find — <em>PWA banners convert 5–6x more often</em>. More than half of users who chose to install a native app from these banners fail to complete installing the app whereas PWA installation is near-instant.</p><p>Sadly, few sites are willing to go on the record about native vs. PWA engagement. If you’d discovered a more effective way to engage with users at lower cost would you be telling your competitors about it? There are also organisational pressures not to embarrass colleagues who may have pitched and developed native apps.</p><p>This leads us to structural challenges, which are perhaps the least talked about effect. Organisations that have legacy web sites frequently developed native apps in separate teams, out of separate budgets, often with separate goals. It isn’t uncommon for native app development to have been outsourced and funded out of speculative funds, e.g. marketing or R&amp;D, with the reasonable understanding that it takes time to grow anything. Unfortunately, this siloing often leads to long learning cycles. Native app teams may learn how to grow their user base, but businesses too often are blind to the overall picture. Is growing your native app actually growing the business? It takes a real dedication to honest business metrics to even begin to tease this out and look at long term value vs. short-term metric growth. As with website bounce rates, many who visit will not stay, and unlike websites, and native apps are <em>vastly</em> more expensive to distribute. Some businesses are so far in denial about this that when you ask them if they pay for native app distribution, they’ll (unironically) say things like “<em>no, we don’t pay for app installs, but we do provide discounts and offers that are only available in the app.</em>”</p><p>Everybody “knows” that native apps work, after all, and some persist well after they hit the wall in terms of cost/benefit to native app distribution. It’s easy to get promoted by pointing to big numbers, and it <em>is </em>possible to grow your install base. Expensive, perhaps ruinously, but possible. Businesses can go years without learning the true cost/benefit of native app strategies — sometimes learning only in a darwinian sense.</p><p>Those that can learn on shorter time scales face a final hurdle: Android blindness.</p><p>Nearly all product owners, decision makers, and influencers (board members, VCs, etc.) in wealthy western countries carry iOS devices. Most have never seriously used an Android device. Because Apple hasn’t implemented PWA technologies in Safari and functionally prevents others from doing so, the expectations of iOS users regarding the web are set low.</p><p><strong><em>The future is here, the rich just don’t have access to it.</em></strong> Those with the fastest hardware on the best networks simply cannot envision what a more capable web could do for their products because they’ve never experienced it. It’s unsurprising, then, that PWAs are getting built and succeeding in geographies where developers and decisions makers carry <a href="https://9to5mac.files.wordpress.com/2017/01/kantar.jpg">the same phones as the majority of users in almost every country</a> on the planet. For more, see Bruce Lawson’s series on the <a href="https://www.smashingmagazine.com/2017/03/world-wide-web-not-wealthy-western-web-part-1/">World Wide Web, Not Wealthy Western Web</a>.</p><p>Some businesses make it to steps 6 and 7 on the timeline above and are receptive to (or seek out) better strategies for getting users access to their services. The set of folks doing this and collecting truly comparable data is small. The set willing to share the data is even smaller. But let’s say your team wants to try, how do you actually conduct a real comparison?</p><p>It may take time and effort. To get a real comparison point, you need <em>experience equivalence</em>. A site that’s drowning in JavaScript won’t attract or retain users:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F4bZvq3nodf4%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D4bZvq3nodf4&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F4bZvq3nodf4%2Fhqdefault.jpg&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7527502a5fbea071e30d4bda1bdb529c/href">https://medium.com/media/7527502a5fbea071e30d4bda1bdb529c/href</a></iframe><p>To really get comparable data, you’ll need to build a high-quality PWA using mobile-first tools like <a href="https://www.polymer-project.org/1.0/toolbox/">Polymer App Toolbox</a>, <a href="https://preactjs.com/">Preact</a>, <a href="https://vuejs.org/">Vue.js</a>, <a href="https://github.com/skatejs/skatejs">Skatejs</a>, or <a href="https://svelte.technology/">Svelte</a>. If you’re a developer, your favorite tool probably isn’t in that list. There’s a reason: the constraints of mobile are much, much harder than we have collectively come to terms with. Most JavaScript libraries are suffering the lingering effects of desktop-era assumptions and have not made the radical shifts necessary to deliver great experiences on mobile. Folks using these tools must go to <a href="https://www.youtube.com/watch?v=dug_6lgZ7dw">extraordinary</a><a href="https://www.youtube.com/watch?v=y6GaRMjNCUQ&amp;index=15&amp;list=PLNrODmzoJwwquif5reHC6VtLbECaIZxWO"> lengths</a> to <a href="https://www.youtube.com/watch?v=e8XejNt5SZo&amp;index=32&amp;t=303s&amp;list=PLNYkxOF6rcIBTs2KPy1E6tIYaWoFcG3uj">make them perform</a> in this environment.</p><p>So let’s say you’ve built a modern PWA that works brilliantly offline, gets a great <a href="https://developers.google.com/web/tools/lighthouse/">Lighthouse score</a>, loads the first time <a href="http://webpagetest.org/easy">in less than 5s on webpagetest.org/easy</a> on the Emerging Markets profile and less than 3s for repeat views. Let’s also assume you’ve <a href="https://web-push-book.gauntface.com/">implemented web push</a>. Congrats! You’re setup to run a real-world A/B test with your native Android app. From this starting point you can actually compare the engagement of users who opt in to adding to the homescreen or agree to receive push notifications. You’ll also be able to compare the costs of acquiring and retaining these users.</p><p>What can you expect? As mentioned earlier, few firms have been willing to share their data on this. Those that have report astonishing comps: <a href="https://www.selio.com/">Selio</a> reported a 10X lower cost to acquire an activated user (someone that has sent a message or made an offer) via their PWA than their Android app. Housing.com reported it was 50x cheaper to get a user experiencing their service when clicking an ad for the PWA vs. a native app. The “progressive” in PWAs <em>matters</em>: you don’t have any up-front hurdle to using your app with the web; a single link is enough.</p><p>Are these outliers? We don’t yet know for certain, but we <em>do</em> know that users are much more likely to accept a PWA request to “Add to Homescreen” than they are to install native apps.</p><p>None of this may be relevant to your site or business. Some sites don’t want or need users to return. Some apps aren’t possible on the web today due to technical limitations (though <a href="https://whatwebcando.today/">we’re chewing through that list quickly</a>). Some markets have unusually high iOS penetration (e.g., Japan), making PWA ROI a smaller opportunity. Or perhaps you work for Facebook and already have high app penetration which you can use to drive low-cost installs of sibling apps. Or perhaps the early data is all a fluke!</p><p>But there’s reason to believe it’s not. PWAs are improving business outcomes for <a href="https://developers.google.com/web/showcase/2016/flipkart">Flipkart</a>, <a href="https://developers.google.com/web/showcase/2016/aliexpress">AliExpress</a>, <a href="https://developers.google.com/web/showcase/2016/konga">Konga</a>, <a href="https://developers.google.com/web/showcase/2016/suumo">Suumo</a>, <a href="https://developers.google.com/web/showcase/2016/alibaba">Alibaba</a>, <a href="https://developers.google.com/web/showcase/2016/housing">Housing.com</a>, and, yes, even<a href="https://www.youtube.com/watch?v=8XLHdetDIgw"> Facebook</a>. Last month’s launch of <a href="https://blog.twitter.com/2017/introducing-twitter-lite">Twitter Lite</a> is another vote of confidence that these experiences can compete on their own terms. It’s an exciting time to be working on the web platform, and like our colleagues on native app teams before us, PWA teams are springing up as side-projects and insurgencies inside organisations that are primed for change. The largest brands that have launched PWAs have done so with surprisingly small and scrappy teams. Not only is it not impossible to build them, it’s frequently cheaper than the alternative. <a href="https://www.wego.com/">Wego</a> built their truly excellent PWA in 3 months with Polymer App Toolbox and one <em>Android</em> engineer who had never built for the web before.</p><p>Thanks to great tools like <a href="https://www.polymer-project.org/2.0/toolbox/">Polymer App Toolbox</a> and <a href="https://developers.google.com/web/progressive-web-apps/">improving documentation</a>, teams today are only being held back by a lack of willpower. Luckily, <a href="https://developers.google.com/web/showcase/">the case is getting easier to make every day</a> as <a href="https://outweb.io/">more and more examples pour in</a>. Seriously, <a href="https://www.pwastats.com/">check out these stats</a>!</p><p>It’s our hope that as we show business and decision makers how much better the web is for their bottom lines, we can improve the experience of computing for everyone.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=18f3952d349a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/dev-channel/why-are-app-install-banners-still-a-thing-18f3952d349a">Why Are App Install Banners Still A Thing?</a> was originally published in <a href="https://medium.com/dev-channel">Dev Channel</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mmmmmmm….Carrots!]]></title>
            <link>https://medium.com/@slightlylate/mmmmmmm-carrots-6b3a53719008?source=rss-fa63e1e8071------2</link>
            <guid isPermaLink="false">https://medium.com/p/6b3a53719008</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Alex Russell]]></dc:creator>
            <pubDate>Tue, 13 Oct 2015 17:52:42 GMT</pubDate>
            <atom:updated>2015-10-14T15:27:39.326Z</atom:updated>
            <content:encoded><![CDATA[<p>Andrew Betts has called the <a href="https://medium.com/@slightlylate/progressive-apps-escaping-tabs-without-losing-our-soul-3b93a8561955">Progressive Apps</a> pattern “<a href="https://trib.tv/2015/10/11/progressive-apps/">a bag of carrots</a>” and, at some level, he’s right: the notion that something is an App <em>does</em> boil down to UI treatment and providing UI in return for developer effort is something browsers are in the business of doing.</p><p>He’s also right that what browsers give users and developers by implementing support for Progressive Apps (like <a href="https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android?hl=en">Chrome</a> and <a href="https://dev.opera.com/blog/installable-web-apps/">Opera</a> have and which <a href="https://wiki.mozilla.org/Firefox_OS/Pinned_Apps">Mozilla is considering</a>) is access to this differentiated UI treatment. It sure does sound flimsy! I mean, once a browser has support for <a href="https://developers.google.com/web/fundamentals/device-access/stickyness/web-app-manifest?hl=en">Manifests</a> and <a href="http://www.html5rocks.com/en/tutorials/service-worker/introduction/">Service Workers</a>, it’s just a bit of UI that lets you hide things like the default URL bar…what’s important about that? Everything, turns out.</p><p>UI treatment was the carrot that enabled SSL adoption and UI treatment is what will eventually sunset unencrypted network connections. These indicators are shown (or not) when developers do the right thing by users, and the browser is the guarantor of the user’s interests.</p><p>To users, the tech isn’t the product, the experience is. Andrew’s post captures this, but at the risk of being quarrelsome, seems to skip from initial window treatment (which we agree is important to “appyness”) to dismissing long-term experience differentiators like offline behavior and connection security which matter in the breach, not the norm. He’s also simply confused about search ranking changes: Google, to the best of my knowledge, doesn’t treat Progressive Apps any differently. <a href="http://googlewebmastercentral.blogspot.com/2015/04/rolling-out-mobile-friendly-update.html">Mobile-friendly</a>, <a href="http://googlewebmastercentral.blogspot.com/2014/08/https-as-ranking-signal.html">secure</a>, <a href="http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html">fast</a> sites? Sure. But those are attributes of any web experience (recall that all Progressive Apps begin life as regular pages). There’s no separate ranking boost (or demotion) for building a Progressive App.</p><p>Which leads us to the bit of Andrew’s post where he’s simply confused. I won’t dwell on those aspects because I feel it’s simply the result of misunderstanding, which knowing Andrew, will soon be corrected. Briefly, though: Andrew misunderstands the role of signals in search ranking, manifests, and Service Worker scopes. They are each potentially complicated topics. I probably owe more words on each, but TL;DR: the control over window focus that Andrew wants is coming via new Service Worker APIs. His concerns (when not unfounded) are going to be addressed (at least in Chrome).</p><p>Every browser is likely to implement their own version of Progressive Apps. It’s a general pattern (like “AJAX”), not a specific implementation. Chrome has set the hurdles to getting appy UI treatment at one particular point (TLS, Service Worker for offline, Manifest); others can do differently, but it is unlikely to make sense to do so.</p><p>In the same way that it’s a bad idea to provide a green lock icon for a fundamentally insecure site, it’s a bad experience for end users to offer an appy install flow for something that’s likely, in the user’s view, to “fail” as an app when disconnected, on MITM’d WiFi, or when the app doesn’t provide a high-quality icon. You’d hope never to find content with those negatives featured in an app store so browsers have incentives to ensure that users only upgrade sites that will prove equivalently useful when launched as apps.</p><p>By focusing on some corner cases (e.g. manifests that signal a desire to open in a tab), it’s possible to cast the ambiguities built into evolving a stable platform in pretty much any light you want. The “progressive” bit in Progressive Apps admits many evolutionary intermediate points. Andrew’s right that Progressive Apps are about incentives, but what the term calls out is a pattern that helps users discover things that embody (on average) a particular package of features that deliver long-term value. Not everything will make the cut, and that’s OK. The old web isn’t going away, but that doesn’t mean we need to pretend it has cleared these experience hurdles. Drawing the distinction is good for users, and that’s all that matters.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6b3a53719008" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Doing Science On The Web]]></title>
            <link>https://medium.com/@slightlylate/doing-science-on-the-web-af26d9be2faa?source=rss-fa63e1e8071------2</link>
            <guid isPermaLink="false">https://medium.com/p/af26d9be2faa</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[standards]]></category>
            <dc:creator><![CDATA[Alex Russell]]></dc:creator>
            <pubDate>Thu, 20 Aug 2015 20:08:48 GMT</pubDate>
            <atom:updated>2015-08-21T15:16:56.575Z</atom:updated>
            <content:encoded><![CDATA[<p>This post is about vendor prefixes, why they didn’t work, and why it’s toxic not to be able to launch experimental features. But mostly this post is about what to do about it. The argument and implications require nuance and long-term thinking. That is to say, despite diligent efforts to clarify and revise, this post is likely to be misunderstood.</p><p>Vendor prefixes are a <a href="https://hsivonen.fi/vendor-prefixes/"><em>very </em>sore</a> <a href="http://folktrash.com/css-vendor-prefixes/">topic</a>, and one <a href="https://infrequently.org/2011/11/vendor-prefixes-are-a-rousing-success/">where I’ve disagreed</a> <a href="https://infrequently.org/2012/02/misdirection/">with the overwhelming consensus</a>. In the heat of the ‘11–12 debate (a.k.a. “prefixpocalypse”) I tried to outline a rough hierarchy of the web platform’s concerns:</p><ol><li>Meeting developer &amp; user experience needs with new features</li><li>Eventual interoperability for successful features</li><li>Minimizing harm to the ecosystem from experiments-gone-wrong</li></ol><p>The <a href="https://trac.webkit.org/wiki/Deprecating%20features%20and%20vendor%20prefixes">debate</a> and <a href="http://www.chromium.org/blink/developer-faq#TOC-Will-we-see-a--chrome--vendor-prefix-now-">subsequent</a> (conflicting) <a href="https://lists.w3.org/Archives/Public/public-webapps/2012OctDec/0731.html">prohibitions</a> &amp; <a href="https://wiki.csswg.org/spec/vendor-prefixes#simple-guidance">advice</a> centered on the third point: minimizing pollution.</p><p>Recall that in 2012, Google, Apple, Blackberry, and a host of other vendors were all shipping browsers based on a single CSS engine (WebKit) without changing the `-webkit-*` prefixes to be <em>vendor-specific</em>. Instead, a large proportion of the web’s users experienced <em>premature compatibility</em> for experimental features. Developers could get the benefits of broad feature support without a corresponding standard. This backed non-WebKit-based browsers into a terrible choice: <a href="http://folktrash.com/css-vendor-prefixes/">“camp” on the other vendor’s</a> prefixed behavior to render content for their users or suffer a loss of users and developer loyalty.</p><p>This illustrates what happens when experiments inadvertently become critical infrastructure. It has happened <a href="https://www.chromestatus.com/metrics/css/popularity#webkit-user-select">before</a>. <a href="https://www.chromestatus.com/metrics/css/popularity#webkit-box-shadow">Over</a>, and <a href="https://www.chromestatus.com/metrics/css/popularity#webkit-appearance">over</a>, and <a href="https://www.chromestatus.com/metrics/css/popularity#webkit-font-smoothing">over</a> <a href="https://www.chromestatus.com/metrics/feature/popularity#DeprecatedWebKitLinearGradient">again</a>.</p><p>Prefixes were supposed to allow experimentation while discouraging misuse, but in practice they don’t. Prefixes “look” ugly and the thought was that ugliness — combined with an aversion to proprietary gunk by web developers — would cause sites to cease using them once standards are in place and browsers implement. But that’s not what happens.</p><p>Useful features that live a long time in the “experimental” phase tend to get “burned in”, particularly if the browsers supporting them are widely used. Breaking existing content is the third rail for browsers; all of their product instincts and incentives keep them from doing it, even if the breakage comes from retracting proprietary features. This means that many prefixed properties continue to work long after standard versions are added. Likewise, sites and pages that work with prefixes are all-too-easy for web developers to write and abandon. It’s unsettling to remove a prefix when you <em>might</em> break a user with an old browser. Maintenance of both sites and browsers rarely subtracts, but the theory of prefixes hinges on subtraction.</p><p>Everyone who uses prefixes, both browser engineers and web developers, start down the path thinking they’ll stop at some point. But for predictable reasons, that isn’t what happens. Good intentions are not an effective prophylactic<strong>.</strong> Not for web developers <em>or</em> browser makers (to say nothing of amorous teens).</p><p><strong>This situation is the natural consequence for platform/developer time-scales that are out of sync.</strong> Browsers move more slowly than sites (at the micro scale), but sites must contend with huge browser diversity and are therefore much more conservative about removing “working” code than browser engineers expected.</p><h3>Now What?</h3><p>Years after Prefixpocalypse everyone who works on a browser understands that prefixes haven’t succeeded in minimizing harm, yet vendors <a href="https://developer.apple.com/library/mac/releasenotes/General/WhatsNewInSafari/Articles/Safari_9.html">proudly announce new prefixed features</a> and <a href="https://www.chromestatus.com/metrics/css/popularity#webkit-border-radius">developers blithely (ab)use them</a>. Clearly, a need for new features trumps interoperability and pollution concerns. This is natural and, perhaps even healthy. A static web, one which doesn’t do more to make lives better is one that doesn’t deserve to thrive and grow. In technology as in life there is no stasis, only various speeds of growth or decay.</p><p>Browsers <em>could </em>stop prefix ecosystem pollution from happening by simply vowing not to add features. This neatly analyses the problem (some experiments don’t work out, and some get out of hand) and proposes a solution (no experimentation), but <a href="https://en.wikiquote.org/wiki/H._L._Mencken#1910s">as H.L. Mencken famously wrote</a>:</p><blockquote><strong>…there is always a well-known solution to every human problem — neat, plausible, and wrong.</strong></blockquote><p>We have already run a natural experiment in this area. At the low point after the first browser war, Microsoft (temporarily) shrink from the challenge of building the web into a platform. Meanwhile IE 6’s momentum assured its place as the <a href="http://www.quirksmode.org/blog/archives/2015/07/stop_pushing_th.html">boat-anchor-browser</a>. Between 2002 and 2006, the web (roughly) didn’t add any new features. Was that better? Not hardly. I’m glad to be done with 9-table-cell image hacks to accomplish rounded corners. <strong><em>Not all change is progress, but without change there is no progress.</em></strong></p><p>Or, put <a href="http://w3cmemes.tumblr.com/post/125283489932/boromir-would-like-ppk-to-know-something-about-the">better by W3C Memes</a>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/540/1*eb5yThYl2RvuYPy4Ro_-mw.jpeg" /><figcaption>“One does not simply ship no new features for a year and remain competitive”</figcaption></figure><p>We <em>do </em>need new features, and we’d like good versions of them — fewer <a href="https://msdn.microsoft.com/en-us/library/ms537434(v=vs.85).aspx"><em>document.all</em></a>s, <a href="http://html5doctor.com/introducing-web-sql-databases/"><em>WebSQL</em></a>s and <a href="http://alistapart.com/article/application-cache-is-a-douchebag"><em>AppCache</em></a>s, thanks.</p><p>We know from experience developing software of all kinds that <em>more iteration </em>yields better results. Experimentation, chances to learn, and opportunities to try alternatives are what separate good ideas from great products. Members of the Google Gears team <a href="https://groups.google.com/forum/#!msg/gears-eng/BUn0q4hLQrk/8srABr_HOQgJ">report they considered</a> building something like <a href="http://www.html5rocks.com/en/tutorials/service-worker/introduction/">Service Workers</a>. Instead <a href="https://web.archive.org/web/20080704040558/http://code.google.com/apis/gears/api_localserver.html">they built an AppCache style system</a> which didn’t work in all the ways AppCache didn’t work (which they couldn’t have known at the time). It shouldn’t have taken 6+ years to course-correct. We need to be able to experiment and iterate. Now that we understand the problems with prefixes, we need another mechanism.</p><h3>Experiments That Stay Experiments</h3><p><strong><em>Prefixpocalypse happened because experiments escaped the lab. </em></strong>Wide-scale use of experimental properties isn’t healthy. Because prefixed properties were available to any site (not matter how large), it was straightforward for the killer combination of broad browser support and major site usage to ensure that compatibility would work against ever ending the experiment. The key to doing better, then, is to limit the size of the experimental population.</p><p>The way prefixes were run was like making a new drug available over the counter as soon as a promising early trial was conducted, skipping animal, human, and large-scale clinical trials. Of course that would be ludicrous; “first do no harm” requires starting with a small population, showing efficacy, gathering data about side-effects, and iterating.</p><p>In the web platform, <strong>the missing ingredient has been the ability to limit the experimental population</strong>. Experiments can run for fixed duration without fear of breaking the web if we can be sure that they never imperiled the whole web in the first place. Short duration and small, committed test populations allow for more iteration which should, in the end, lead to better features. <strong><em>The web developer feedback needs to be the most important voice in the standards process</em></strong><em>, and we’ll never get there until there’s more ability for web developers to participate in feature evolution. </em>Experimental outcomes are ammo for the standards development process; in the best-case they can provide good evidence that a feature is both needed and well-designed.</p><p>Putting evidence at the core of web feature and standards development is a 180° change from the current M.O., but one we sorely need.</p><p>So how do we get there?</p><p>Some mechanisms I’ve thought through and rejected (with reasons):</p><ul><li><em>“Just have users flip things in about:flags”<br></em>This has several persistent downsides: first, it doesn’t limit the size of the experimental population. If every site encourages users to flip a particular flag, odds are enough users will do so to set usage above a red-line threshold.</li><li><em>“Enable it by default on your Beta/Dev channel browser”</em><br>Like the flag-flipping mechanism, it puts a burden on users which is perhaps the wrong place to put it. Experimentation of this sort is likely to get better feedback when developers can work with experimental features without the additional friction of asking users to use different browsers.</li></ul><p>The Chrome Team has been thinking about this problem for the past several years, including conversations with other vendors, and those ideas have congealed into a few interlocking mechanisms that haven’t been rejected:</p><ol><li><strong>Developer registration &amp; usage keys</strong>.<br>A large part of the reason it’s difficult to change developer behavior about use of experimental features is that <em>it’s hard to find them!</em> Who would you call to talk about use of some prefixed CSS thing on facebook.com? I don’t know either. Having an open communication channel is critical to learning how features are working (or not) in the real world. To that end, new experimental features will be <em>tied to specific origins</em> using keys vended by a developer program; sites supply the keys to the browser through header/meta tags, enabling the features dynamically. Registration for the program will probably require giving a (valid) email address and agreeing to answer survey questions about experimental features. Because of auto-self-destruct (see below), there’s less worry that these experiments will be abused to provide proprietary features to “preferred” origins. Public dashboards of running experiments and users will ensure transparency to this effect.</li><li><strong>Global usage caps</strong>.<br>The Blink project generally uses a ~0.03% usage threshold to decide if it’s plausible to remove a feature. Experimenters might use our <a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/ze27T2M682w">Use Counter infrastructure</a> and <a href="http://research.google.com/pubs/pub42852.html">RAPPOR</a> to monitor use. Any feature that breaches this threshold can automatically close the experiment to new users and, if any individual user goes above ~0.01% (global) use, a config update can be pushed to throttle use on that site.</li><li><strong>Feature auto-self-destruct.<br></strong>Experimental features should be backed by a process that’s trying to learn. To enable this, we’re going to ensure that each version of an experimental feature auto-self-destructs, tentatively set at 12–18 weeks per experiment. New iterations which are designed to test some theory can be launched once an experiment has finished (but must have <em>some </em>API or semantic difference, preferably breaking). Sites that want to opt into the next experiment and were part of a previous group will be asked survey questions in the key-update process (which is probably going to be a requirement for access to future experimental versions). Experiments can overlap to provide continuity for end-users who are willing to move to the next-best-guess and provide feedback.</li></ol><p>We’re also going to work to ensure that the surfaced APIs are done in a responsible way, including feature-detection where possible. These properties add up to a solution that gives us confidence that we can create <strong>Ctrl-Z for web features</strong> without damaging users or sites.</p><p>In discussions with our friends in the community and at other browser vendors we’ve thought through alternative ways to throttle or shrink the experimental population: randomness in API names, limiting APIs to postMessage style calling, or shortening experiment lifetimes. As Chrome is going first, we’ll be iterating on the experimental framework to try to strike the right balance that allows enough use to learn from but not so much that we inadvertently commit to an API. We&#39;ll also be sharing what we learn.</p><p>My hope is that other browsers implement similar programs and, as a corollary, cease use of prefixes. If they do, I can imagine many future areas for collaboration on developing and running these experiments. That said, it’s desirable to for different browsers to be trying different designs; we learn more through diversity than premature monoculture.</p><p>Moving faster and building better features don’t have to be in tension; we can do better. It’s time to try.</p><p><em>Thanks to </em><a href="http://www.owencampbellmoore.com/"><em>Owen Campbell-Moore</em></a><em>, </em><a href="https://twitter.com/medleyj64119"><em>Joe Medley</em></a><em>, </em><a href="https://medium.com/@jyasskin"><em>Jeff Yasskin</em></a><em>, </em><a href="https://twitter.com/adrianba"><em>Adrian Bateman</em></a><em>, </em><a href="https://jakearchibald.com/"><em>Jake Archibald</em></a><em>, </em><a href="https://twitter.com/iclelland"><em>Ian Clelland</em></a><em>, </em><a href="https://beebo.org/"><em>Michael Stillwell</em></a><em>, </em><a href="http://addyosmani.com/blog/"><em>Addy Osmani</em></a><em>, and </em><a href="http://cwilso.com/"><em>Chris Wilson</em></a><em>, and </em><a href="https://twitter.com/paul_irish"><em>Paul Irish</em></a><em> for their invaluable feedback on drafts of this post.</em></p><p><a href="https://infrequently.org/2015/08/doing-science-on-the-web/"><em>Cross-posted from my personal blog.</em></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=af26d9be2faa" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Progressive Web Apps:
Escaping Tabs Without Losing Our Soul]]></title>
            <link>https://medium.com/@slightlylate/progressive-apps-escaping-tabs-without-losing-our-soul-3b93a8561955?source=rss-fa63e1e8071------2</link>
            <guid isPermaLink="false">https://medium.com/p/3b93a8561955</guid>
            <category><![CDATA[open-web]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Alex Russell]]></dc:creator>
            <pubDate>Mon, 10 Aug 2015 19:50:04 GMT</pubDate>
            <atom:updated>2015-11-29T22:06:31.155Z</atom:updated>
            <content:encoded><![CDATA[<p>It happens on the web from <a href="http://www.adaptivepath.com/ideas/ajax-new-approach-web-applications/">time</a> to <a href="http://alistapart.com/article/responsive-web-design">time</a> that powerful technologies come to exist without the benefit of marketing departments or slick packaging. They linger and grow at the peripheries, becoming old-hat to a tiny group while remaining nearly invisible to everyone else. Until someone names them.</p><p>This may be the inevitable consequence of a standards-based process and unsynchronized browser releases. We couldn’t keep a new feature secret if we wanted to, but that doesn’t mean anyone will hear about it. XMLHTTPRequest was available broadly <a href="https://en.wikipedia.org/wiki/XMLHttpRequest">since IE 5</a> and in Gecko-based browsers from as early as 2000. <a href="http://www.adaptivepath.com/ideas/ajax-new-approach-web-applications/">“AJAX” happened</a> 5 years later.</p><p>This eventual adding-up of new technologies changes how we build and deliver experiences. They succeed when bringing new capabilities while maintaining shared principles:</p><ul><li>URLs and links as the core organizing system: if you can’t link to it, it isn’t part of the web</li><li>Markup and styling for accessibility, both to humans and search engines</li><li>UI Richness and system capabilities provided as additions to a functional core</li><li><a href="http://www.w3.org/2012/08/open-stand-w3c.html">Free to implement</a> without permission or payment, which in practice means standards-based</li></ul><p>Major evolutions of the web must be compatible with it culturally as well as technically.</p><p>Many platforms have attempted to make it possible to gain access to “exotic” capabilities while still allowing developers to build with the client-side technology of the web. In doing so they usually jettison one or more aspect of the shared value system. They aren’t <em>bad</em> — many are technically brilliant — but they aren’t of the web:</p><ul><li><a href="http://www.adobe.com/products/air.html">Adobe AIR Applications</a></li><li><a href="https://msdn.microsoft.com/en-us/library/windows/apps/br211385.aspx">Windows Store Apps</a></li><li><a href="https://developer.chrome.com/extensions/apps">Chrome Packaged Applications</a></li><li><a href="https://developer.mozilla.org/en-US/Apps/Build/Building_apps_for_Firefox_OS">Firefox OS Packaged Applications</a></li><li><a href="https://cordova.apache.org/">Cordova/PhoneGap</a> and <a href="https://crosswalk-project.org/">Crosswalk</a> Apps</li><li><a href="https://developer.blackberry.com/html5/">BlackBerry WebWorks Apps</a></li><li><a href="http://www.w3.org/TR/widgets/">W3C Widgets</a> (these <a href="http://dev.w3.org/2006/waf/widgets/imp-report/">enjoyed several implementations</a>)</li><li><a href="http://www.openwebosproject.org/">WebOS Apps</a></li><li><a href="https://bitbucket.org/chromiumembedded/cef">Chromium Embedded Framework</a></li><li><a href="http://electron.atom.io/">Electron</a></li></ul><p>These are just the ones that spring to mind offhand. I’m sure there have been others; it’s a popular idea. They frequently give up linkability in return for “appiness”: to work offline, be on the home screen, access system APIs, and re-engage users they require packaging and distributed through stores, implying that they must be downloaded entirely before being experienced.</p><p>Instead of clicking a link to access the <em>content</em> you’re looking for, these systems make stores the mediators for discovery of content. The <a href="http://www.smashingmagazine.com/2014/10/21/providing-a-native-experience-with-web-technologies/">hybridzation process</a> generates applications which can no longer live in or with the assumptions of the web. How does one deploy to all of these stores all at once? Can one still keep a fast iteration pace? How does the need to package everything up-front change your assumptions and infrastructure? How does search indexing work? It’s a deep tradeoff that pits fast-iteration and linkability against offline and store discovery.</p><h4>Escaping the Tab: Progressive, Not Hybrid</h4><p>But there is now another way. An evolution has taken place in browsers.</p><p>Over dinner last night, <a href="http://fberriman.com/">Frances</a> and I enumerated the attributes of this new class of applications:</p><ul><li><a href="http://alistapart.com/article/responsive-web-design"><strong>Responsive</strong>:</a> to fit any form factor</li><li><strong>Connectivity independent</strong>: Progressively-enhanced with <a href="http://www.html5rocks.com/en/tutorials/service-worker/introduction/">Service Workers</a> to let them work offline</li><li><strong>App-like-interactions</strong>: Adopt a Shell + Content application model to create appy navigations &amp; interactions</li><li><strong>Fresh</strong>: Transparently always up-to-date thanks to the Service Worker update process</li><li><strong>Safe</strong>: Served via TLS (a Service Worker requirement) to prevent snooping</li><li><strong>Discoverable</strong>: Are identifiable as “applications” thanks to <a href="https://w3c.github.io/manifest/">W3C</a> <a href="https://developers.google.com/web/updates/2014/11/Support-for-installable-web-apps-with-webapp-manifest-in-chrome-38-for-Android">Manifests</a> and Service Worker registration scope allowing search engines to find them</li><li><strong>Re-engageable</strong>: Can access the re-engagement UIs of the OS; e.g. <a href="https://developers.google.com/web/updates/2015/03/push-notificatons-on-the-open-web">Push Notifications</a></li><li><a href="https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android?hl=en"><strong>Installable</strong>: to the home screen through browser-provided prompts</a>, allowing users to “keep” apps they find most useful without the hassle of an app store</li><li><strong>Linkable</strong>: meaning they’re zero-friction, zero-install, and easy to share. The social <a href="http://www.theatlantic.com/technology/archive/2012/10/dark-social-we-have-the-whole-history-of-the-web-wrong/263523/">power of URLs</a> <em>matters</em>.</li></ul><p>These apps aren’t packaged and deployed through stores, they’re just websites that took all the right vitamins. They keep the web’s ask-when-you-need-it permission model and add in new capabilities like being top-level in your task switcher, on your home screen, and in your notification tray. Users don’t have to make a heavyweight choice up-front and don’t implicitly sign up for something dangerous just by clicking on a link. Sites that want to send you notifications or be on your home screen have to <em>earn</em> that right over time as you use them more and more. They progressively become “apps”.</p><p>Critically, these apps can <a href="https://www.youtube.com/watch?v=d5_6yHixpsQ">deliver an even better user experience</a> than traditional web apps. Because it’s also possible to build this performance in as progressive enhancement, the tangible improvements make it worth building this way regardless of “appy” intent.</p><p><a href="http://fberriman.com/">Frances</a> called them “Progressive Open Web Apps” and we both came around to just “Progressive Web Apps”. They existed before, but now they have a name.</p><h4>What Progressive Web Apps Look Like</h4><p>Taking last year’s <a href="https://developer.chrome.com/devsummit/">Chrome Dev Summit site</a> as an example, we can see the whole flow in action (ht: <a href="https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android?hl=en">Paul Kinlan</a>):</p><ol><li>The site begins life as a regular tab. It doesn’t have super-powers, but it <em>is</em> built using Progressive App features including TLS, Service Workers, Manifests, and Responsive Design.</li><li>The second (or third or fourth) time one visits the site — roughly at the point where the browser it sure it’s something you use frequently — a prompt is shown by the browser (populated from the Manifest details)</li><li>Users can decide to keep apps to the home screen or app launcher</li><li>When launched from the home screen, these apps blend into their environment; they’re top-level, full-screen, and work offline. Of course, they worked offline after step 1, but now the implicit contract of “appyness” makes that clear.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/597/1*DYjPm6A9VuxueEU7mD_lPQ.gif" /><figcaption>The Chrome Dev Summit site installing as a Progressive App.</figcaption></figure><p>Here’s the same flow on Flipboard today:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/430/0*dffmL_sTEr7vXamb.png" /></figure><p>Progressive Apps are web apps, they begin life in a tab. Here we see flipboard.com in Chrome for Android with regular tab treatment.</p><p>When users engage with Progressive Web Apps enough, browsers offer prompts that ask users if they want to keep them. To avoid spaminess, this doesn’t happen on the first load.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/430/0*VLaTu-kv3yWdNfIZ.png" /></figure><p>If the user accepts, the user’s flow isn’t interrupted.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/430/0*01cZo2AwhdvHsrWg.png" /></figure><p>The app shortcut appears on the homescreen or launcher of the OS.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/430/0*sfgFRKgJTDNgIK_J.png" /></figure><p>When launched, Progressive Web Apps can choose to be full-screen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/430/0*ME5KAtNgzIxl6V3U.png" /></figure><p>Progressive Web Apps are top-level activities in the OS’s application switcher.</p><h4>The Future</h4><p>Today’s web development tools and practices don’t yet naturally support Progressive Web Apps, although many frameworks and services are close enough to be usable for making Progressive Web Apps. In particular, client-side frameworks that have server-rendering as an option work well with the model of second-load client-side routing that Progressive Web Apps naturally adopt as a consequence of implementing robust offline experiences.</p><p>This is an area where thoughtful application design and construction will give early movers a major advantage. Full Progressive App support will distinguish engaging, immersive experiences on the web from the “legacy web”. Progressive App design offers us a way to build better experiences across devices and contexts within a single codebase but it’s going to require a deep shift in our understanding and tools.</p><p>Building immersive apps using web technology no longer requires giving up the web itself. Progressive Web Apps are our ticket out of the tab, if only we reach for it.</p><p><em>Thanks to </em><a href="http://fberriman.com/"><em>Frances Berriman</em></a><em>, </em><a href="https://briankardell.wordpress.com/"><em>Brian Kardell</em></a><em>, </em><a href="http://jakearchibald.com/"><em>Jake Archibald</em></a><em>, </em><a href="http://www.owencampbellmoore.com/"><em>Owen Cambpell-Moore</em></a><em>, </em><a href="http://writing.jan.io/"><em>Jan Lehnardt</em></a><em>, </em><a href="http://www.sowbug.com/"><em>Mike Tsao</em></a><em>, </em><a href="http://yehudakatz.com/"><em>Yehuda Katz</em></a><em>, </em><a href="http://www.paulirish.com/"><em>Paul Irish</em></a><em>, </em><a href="https://twitter.com/mattsmcnulty"><em>Matt McNulty</em></a><em>, and </em><a href="http://www.webdirections.org/"><em>John Allsopp</em></a><em> for their review and suggestions on this post.</em></p><p><em>Originally published at </em><a href="https://infrequently.org/2015/06/progressive-apps-escaping-tabs-without-losing-our-soul/"><em>infrequently.org</em></a><em> on June 15, 2015.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3b93a8561955" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>