Decision Guide
Pick PWA when the web gives you enough platform capability and the main value is shipping a reachable product quickly.
Fast Decision
| Question | If yes | If no |
|---|---|---|
| Can the product run as a normal web app first? | Start web/PWA | Consider native, desktop, or backend-first |
| Is offline useful but recoverable? | Use service worker plus IndexedDB | Avoid PWA for safety-critical offline behavior |
| Are required APIs available in target browsers? | Feature-detect and test | Use native or a wrapper with native modules |
| Is store distribution optional? | Browser install first | Plan signing, review, and wrapper policy before implementation |
| Can one codebase satisfy UX expectations? | PWA is likely enough | Native or Flutter may be a better product fit |
Good Product Shapes
- SME ledgers, field forms, inspection checklists, CRMs, admin tools, internal dashboards, learning apps, and reporting surfaces.
- Apps where the browser version remains the canonical product and installation improves retention.
- Static or mostly static Astro/Vite apps that need a better returning-user surface.
- Workflow apps that need offline drafts, queued uploads, or cached reference data.
Weak Product Shapes
- Always-on GPS, long-running sensor capture, alarm-grade scheduling, call/SMS automation, Bluetooth-heavy workflows, or OS automation.
- Apps that must be invisible in the background and still do important work.
- Apps where store subscriptions, in-app purchases, platform review, or native ad networks define the business model.
- Pixel-perfect native UX where web controls and browser process boundaries are a liability.
Recommendation
Start with a browser-installable PWA for web-first workflow products. Add store wrappers only after the browser product works and there is a concrete distribution reason.
For a solo developer, the biggest trap is pretending a PWA avoids platform work. It avoids a native UI rewrite, but you still own install testing, offline data, service worker updates, notification permission UX, browser differences, and wrapper policy.