Progressive Web Apps for MVPs: Ship Mobile Without the App Store
One of the most common dilemmas for MVP founders is mobile. Users expect mobile access. Native apps are expensive and slow to build. Maintaining a web app and a native app in parallel is a significant overhead most early-stage teams can't afford.
Progressive Web Apps (PWAs) sit in a useful middle ground — and for many MVPs, they're the right answer.
What Makes a PWA Different From a Regular Web App
A Progressive Web App is a web application that uses modern browser APIs to behave like a native app. The core capabilities:
- Installable — users can add it to their home screen on Android and iOS. No App Store required.
- Offline-capable — a service worker can cache assets and data so the app works without a connection
- Push notifications — with user permission, you can send push notifications the same way native apps do
- Full-screen mode — when launched from the home screen, there's no browser chrome; it feels like a native app
- Fast loading — pre-cached assets load instantly, even on slow connections
None of this requires submitting to an app store, waiting for review, or maintaining a separate codebase. You build the web app once. The PWA layer is a set of configuration files and a service worker on top of it.
When a PWA Is the Right Mobile Strategy for Your MVP
PWAs are a strong choice when:
- Your MVP is primarily content, forms, or data — social feeds, dashboards, booking flows, tools, and SaaS products all work well as PWAs
- Android is your primary mobile platform — PWA support is excellent on Android. iOS supports most PWA features but has historically been more restricted (notifications were iOS 16.4+)
- You want one codebase — your web developers maintain a single product instead of coordinating with iOS/Android teams
- Speed to market matters more than platform-specific UX — you can ship a PWA in weeks; native apps take months
PWAs are a weaker choice when:
- Your product requires deep hardware access (Bluetooth, NFC, camera beyond basic capture, ARKit/ARCore)
- Your App Store presence is itself part of your marketing strategy
- Your iOS users are the primary audience and you need iOS-specific features
Setting Up PWA in Nuxt
Nuxt has first-class PWA support via the @vite-pwa/nuxt module. Setup takes under an hour.
1. Install the module
npm install @vite-pwa/nuxt -D
2. Add to nuxt.config.ts
export default defineNuxtConfig({
modules: ['@vite-pwa/nuxt'],
pwa: {
manifest: {
name: 'Your App Name',
short_name: 'AppName',
description: 'What your app does',
theme_color: '#ffffff',
icons: [
{ src: '/icons/icon-192.png', sizes: '192x192', type: 'image/png' },
{ src: '/icons/icon-512.png', sizes: '512x512', type: 'image/png' }
]
},
workbox: {
navigateFallback: '/',
globPatterns: ['**/*.{js,css,html,png,svg,ico}']
},
devOptions: {
enabled: true,
type: 'module'
}
}
})
3. Add icons
Generate icons at 192×192 and 512×512 pixels and place them in /public/icons/. Tools like PWA Asset Generator automate this from a single source image.
4. Test the install prompt
In Chrome DevTools → Application → Manifest, you can verify your manifest is correctly loaded and test the install prompt. On a real Android device, visiting your deployed PWA will trigger the browser's "Add to Home Screen" banner after a few visits.
Offline Support, Push Notifications, and Install Prompts
Offline support
The Workbox configuration in the module handles service worker generation. The globPatterns option controls which files are pre-cached. For a Nuxt app, the defaults cache JavaScript, CSS, HTML, and images — enough for the app shell to load offline even without a connection.
For dynamic data (API responses), you can configure runtime caching strategies: cache-first (serve from cache, update in background) or network-first (try the network, fall back to cache).
Push notifications
Push notifications require a VAPID key pair (generated once, stored in your environment variables) and a subscription flow. The user is prompted to allow notifications; if they accept, you store their push subscription and send notifications server-side when needed.
For most MVPs, push notifications are a v2 feature. Get the installable PWA working first.
Install prompt
You can capture and control when the install prompt appears using the beforeinstallprompt event. This lets you show your own custom UI ("Add to your home screen for the best experience") instead of relying on the browser's default banner.
PWA vs React Native vs Expo: Choosing for Your Situation
| Option | Build time | iOS/Android | Codebase | App Store |
|---|---|---|---|---|
| PWA | Fast (add to web app) | Web-based; good Android, decent iOS | One (web) | Not required |
| React Native | Slow (separate project) | Full native | Separate from web | Required |
| Expo | Moderate | Near-native | Separate from web | Required for stores |
| Capacitor (web → native) | Moderate | Wraps web app | One (web) | Required |
For a Nuxt MVP: start with a PWA. If you validate demand and need native capabilities or App Store distribution, add Capacitor to wrap your existing web app — this is a one-time migration rather than a full rewrite.
The Honest Limits of PWAs
PWAs are excellent for most MVPs. They have real limits:
- iOS push notifications work but require iOS 16.4+ and have some behavioral differences from Android
- App Store discoverability — you don't appear in the App Store, which matters if discovery is a channel for you
- Hardware APIs — Bluetooth, NFC, and some sensors are not accessible from PWAs
- Performance ceiling — for graphics-intensive apps (games, complex animations), native or React Native performs better
For most early-stage B2B tools, SaaS products, and consumer utilities, none of these limits are blocking.
If you're building a Nuxt MVP and want it to work well on mobile from day one, a PWA is the fastest path. If you're unsure whether your use case fits, let's talk.