Native Apps are Doomed

From now on, I won’t be building any more native apps. All my apps going forward will be progressive web apps. Progressive web apps are web applications which are designed to work even more seamlessly on mobile devices than native mobile apps.
What do I mean by “more seamlessly?” I mean that most web traffic comes from mobile devices, and that users install between 0–3 new apps per month, on average. That means that people aren’t spending a lot of time looking for new apps to try out in the app store, but they are spending lots of time on the web, where they might discover and use your app.
Progressive web applications start out just like any other web app, but when a user returns to the app and demonstrates through usage that they’re interested in using the app more regularly, browsers will invite the user to install the app to their home screens. PWA’s can also benefit from push notifications, like native apps.
This is where it gets interesting. Just like any native app, the progressive web app will have its own home screen icon, and when you click on it, the app will launch without the browser chrome. That means no URL bar and no web navigation UI. Just the phone’s usual status bar and your app in all its almost-full-screen glory.
This has been a long time coming. None of the technology is particularly new — with the notable exception of the emerging cross-platform standard.
Some History
In the early days of the iPhone, there was no app store. Steve Jobs wanted developers to build iPhone apps using standard web technologies.
Sometimes visionaries are spot on, but they’re 10 years ahead of their time. Looking back from 2 years ago, Steve Jobs’ recommendation to build web apps for iPhone was called his “biggest mistake” by Forbes, because native apps became a smashing success.
Looking back today, it seems obvious that he was really onto something — just way ahead of the capabilities of the existing web standards of the day.
A decade later, mobile web standards now support many of the features developers looked for with native apps, and Steve Jobs’ original vision for mobile web applications is now being pursued seriously by the rest of the world. Apple has supported “apple-mobile-web-capable” web apps that you can add to your home screen almost since the beginning using meta tags that help iOS devices find things like suitable icons.
Other vendors followed suit, each creating their own collection of meta tags to declare mobile web app capabilities, but recently, a cross-platform specification was introduced, and now, cross-platform mobile web apps are finally becoming a real thing.
The apps implementing the standard are called progressive web applications, not to be confused with confusingly similar terms like progressive enhancement or responsive apps.
What Are Progressive Web Apps?
Progressive web apps are just web applications designed to be mobile friendly. If the browser sees that the user wants to keep using the app, it may prompt the user to install it to their home screen, dock, etc… In order to qualify though, they have to meet a specific criteria:
- Must be HTTPS (see let’s encrypt)
- Valid manifest with required properties (Web Manifest Validator)
- Must have service worker
- Manifest
start_urlmust always load, even offline (using service worker) - Must supply its own navigation
- Should be responsive to different screen sizes and orientations
Of course, using HTTPS and a service worker for offline users is just good practice for any modern app.
What many app builders seem to forget is that if you build a progressive web application, you must be able to navigate the application without the browser chrome and browser navigation gestures. The mobile devices assume that you’ve built your own navigation into the app.
For example, if you have an about page, that page must have a link back to the app UI, or the users will have to close and reopen the app to get back to your main app UI.
Progressive Web Apps How-To
There’s a lot of information about building progressive web applications spread all over the web, but many of them are out of date, and lots of them contain only a fraction of what you need to know to build one. Let’s fix that.
Enable HTTPS
[EDIT: 2020 Update]: Use Next.js and deploy with Vercel, and HTTPS, along with page bundle splitting, static server renders, CDN delivery, cache header management and GitHub CI/CD deployment integration will automatically be handled out of the box. It’s like having the best full-time DevOps team in the world, but instead of costing hundreds of thousands of dollars per year, they save you thousands of dollars per month on hosting bills.
Here’s the old instructions, just so we can laugh at all the hoops we once had to jump through to build an app:
To enable HTTPS, you’re going to need:
* A web server (I recommend DigitalOcean)
* An SSL certificate
* A strong Diffie-Hellman group (
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048)
* TLS/SSL config for your web server (instructions for Nginx on Ubuntu)
The Manifest
The manifest file is called manifest.json and it’s pretty simple. It consists of the name (short_name for the home screen icon, and an optional name for a more complete name), a start url, and a large list of icons so you can support the large range of different icon sizes needed for various platforms. For Android + iOS, you’ll need:
- 36x36
- 48x48
- 60x60 (Apple touch icon iPhone)
- 72x72
- 76x76 (Apple touch icon iPad)
- 96x96
- 120x120 (Apple touch icon iPhone retina)
- 152x152 (Apple touch icon iPad retina)
- 180x180 (Apple touch icon for iOS 8+)
- 192x192
- 512x512
I singled out the Apple touch icons because they have the well-known names:
apple-touch-icon-180x180.png
Where 180x180 can be replaced by whatever the specific resolution is. Using the well-known names is not required, but if you forget to include the tags, iOS can still find the icons by searching for them in your web app’s root directory if you use the well-known names.
The iOS icons don’t support transparency.






