§ I

Introduction — Two Philosophies, One Goal

Every time you tap an icon on your phone or type a URL into a browser, you are choosing between two fundamentally different ways software can be delivered to you. A native app is a program built specifically for one operating system — iOS or Android — using that platform's own programming languages and toolkits, installed from an app store, and compiled directly into machine code that runs on your device's processor. A web app is a program that lives on a server and is rendered inside a browser, built from HTML, CSS, and JavaScript — the same three technologies that power every website you've ever visited.

For the average reader, this distinction might seem academic. Instagram and Gmail both "just work" — you tap, you scroll, you get things done. But underneath that seamless experience lie two radically different engineering philosophies, each with sharp trade-offs in speed, cost, access to your phone's hardware, how often the software updates, and even how much battery it drains.[1]

For developers and product teams, this is not an academic question at all — it is one of the most consequential decisions in a product's lifecycle. Choose native, and you commit to faster performance and deeper hardware access, but you also commit to writing and maintaining two separate codebases (Swift/Kotlin), navigating app store review queues, and a development bill that frequently runs 2–3 times higher than the web alternative.[2] Choose web, and you ship to every device with a single codebase and update instantly — but you accept slower performance, restricted access to hardware, and the uphill battle of getting users to bookmark a website the way they'd download an app.

Neither approach is universally "better." The right choice depends entirely on what your application needs to do, who it needs to reach, and what resources you have to build and maintain it. This article walks through every dimension of that decision — in enough technical depth for engineers, and in plain enough language for anyone who has ever wondered why some apps feel instant while others feel sluggish.

Who This Article Is For

This is a long, detailed piece, deliberately so. It is written in two interleaved registers: accessible explanations for the curious general reader who wants to understand why their banking app feels different from their banking website, and rigorous technical detail for developers, architects, and product managers who need to make or defend a real build decision. Sections on architecture, frameworks, and code patterns are clearly marked — skim them if you're here for the conceptual picture, or slow down and read closely if you're here to build something.

§ II

A Short History — How We Got Two Kinds of Apps

To understand why this debate exists at all, it helps to know how both paths emerged.

The Native Era (2007–2010)

When the iPhone launched in 2007, there was no App Store — Steve Jobs initially insisted that web apps were the way third-party developers should build for iOS. That changed within a year. The App Store opened in July 2008, followed by the Android Market (later Google Play) later that year, and a gold rush began. Native development offered something the mobile web of 2008 simply could not: smooth animations, offline functionality, and direct access to the camera, GPS, and accelerometer. For nearly a decade, "building an app" meant building two native apps — one in Objective-C (later Swift) for iOS, one in Java (later Kotlin) for Android.

The Rise of the Mobile Web and Hybrid Approaches (2010–2015)

As mobile browsers matured, frameworks like PhoneGap (later Apache Cordova) and Ionic emerged, wrapping a web app inside a native shell — giving developers access to the app store while writing in HTML, CSS, and JavaScript. These "hybrid" apps offered a single codebase, but at a real performance cost: they ran inside a WebView, an embedded browser component, which added a layer of overhead that native code didn't have to pay.

Progressive Web Apps and Convergence (2015–Present)

In 2015, Google engineer Alex Russell coined the term Progressive Web App (PWA) — a website that, through a combination of service workers, a web app manifest, and HTTPS, can be "installed" to a home screen, work offline, send push notifications, and look indistinguishable from a native app at first glance. The gap has continued to narrow: as of 2025, both iOS and Android allow PWAs to be installed directly to the home screen, and Firefox added PWA support on Windows as recently as September 2025.[3] Meanwhile, cross-platform native frameworks — React Native, Flutter, and Kotlin Multiplatform — emerged to solve native development's "two codebases" problem from the other direction, letting developers write once and compile to genuinely native code on both platforms.

The result, in 2026, is not two cleanly separated categories but a spectrum: fully native apps at one end, plain websites at the other, and a wide middle ground of PWAs, hybrid apps, and cross-platform native apps occupying the space in between.

§ III

The Engine Room — Technical Architecture

This section gets technical. If you're a general reader, the short version is: native apps talk directly to your phone's processor; web apps talk to your phone's processor through an interpreter (the browser) — and that interpreter is the source of almost every trade-off in this article.

How Native Apps Run

A native iOS app is typically written in Swift (or Objective-C in legacy codebases) using Apple's UIKit or modern declarative SwiftUI framework. A native Android app is written in Kotlin (the language Google now recommends over Java) using the Jetpack Compose toolkit for declarative UI, or the older XML-based View system. In both cases, the application code is compiled — ahead of time, before the user ever opens it — into machine code or an intermediate bytecode that the operating system's runtime executes with minimal translation overhead.

Crucially, native UI components — buttons, scroll views, navigation transitions — are the operating system's actual native widgets. When you scroll a native iOS list, you are interacting with UIScrollView, a component Apple has spent over a decade optimizing at the OS level for buttery 120Hz ProMotion scrolling. There is no translation layer between your tap and the screen redraw.

How Web Apps Run

A web app's HTML, CSS, and JavaScript are not executed directly by the device's processor. They are parsed and interpreted by a browser engine — Blink (Chrome, Edge, most Android browsers), WebKit (Safari, and by Apple's policy, every browser on iOS regardless of brand), or Gecko (Firefox). This engine must parse your HTML into a DOM tree, compute styles from your CSS, execute your JavaScript through a JIT (just-in-time) compiler like V8 or JavaScriptCore, and then composite everything into pixels — all while running inside a sandboxed process that itself runs as an app on top of the OS.

// Simplified rendering pipeline comparison Native: Swift/Kotlin source → AOT compile → machine code → GPU Web App: HTML/CSS/JS → Browser parse → DOM/CSSOM → JS engine (JIT) → Render tree → GPU

This extra layer — parse, interpret, composite — is not free. It is the single biggest reason native apps have historically out-performed web apps on raw speed, and it's why a poorly optimized JavaScript-heavy web app can feel sluggish even on powerful hardware.

WebAssembly — Closing the Gap From the Web Side

WebAssembly (Wasm) is a binary instruction format that runs in the browser at near-native speed, designed as a compilation target for languages like C++, Rust, and Go. Wasm doesn't replace JavaScript for DOM manipulation, but it allows computationally intensive code — image processing, physics simulation, codec decoding — to run inside the browser sandbox without paying JavaScript's interpretation overhead. Figma's web app, for instance, uses a C++ rendering engine compiled to WebAssembly to achieve performance that would have been unthinkable for a "web app" a decade ago.

Cross-Platform Native — Write Once, Compile to Real Native Code

It's worth distinguishing cross-platform native frameworks from web technology, because they're often confused. React Native lets developers write UI logic in JavaScript/TypeScript, but that logic ultimately drives genuine native UIKit and Android View components — there is no embedded browser. Flutter, Google's framework, goes further: it doesn't use native platform widgets at all, but instead renders every pixel itself using its own high-performance C++ rendering engine (Skia, transitioning to Impeller), achieving consistent 60–120fps performance across both platforms from a single Dart codebase. Kotlin Multiplatform lets teams share business logic (networking, data models, validation) across iOS and Android while keeping the UI layer fully native and platform-specific on each side.

These frameworks exist precisely because the "two codebases" cost of pure native development is real, and teams have spent a decade trying to solve it without sacrificing the performance ceiling that makes native worthwhile in the first place.

§ IV

Performance — What the Data Actually Shows

Performance is the most cited reason to choose native, and the claim is not just marketing — it is measurable and has been measured.

Peer-Reviewed Evidence

A 2023 study published on arXiv by Horn et al. directly compared native Android apps against their web app counterparts across CPU usage, memory consumption, network traffic, and — notably — energy consumption.[4] The findings were unambiguous: native apps consumed significantly less energy than their web counterparts, with a large effect size in the statistical analysis. Web apps used more CPU and memory than native apps, also with a large effect size. Network traffic volume favoured native apps with a smaller, but still statistically significant, effect. The researchers' practical conclusion: where a native option exists, users should prefer it over the web equivalent for the same task, primarily on battery-life grounds.[4]

Industry Benchmarks

Industry analysis from 2025–2026 broadly corroborates the academic findings while adding nuance. A widely cited 2025 industry report from Brainhub found that for typical, non-graphics-intensive business applications, the perceivable user-experience gap between a well-optimized PWA and a native equivalent has shrunk to less than 10% — but for graphics-intensive or computation-heavy tasks (gaming, video editing, AR), native apps retain a significant, measurable advantage.[5] This is the most important nuance in the entire performance debate: the gap hasn't closed uniformly — it has closed dramatically for ordinary CRUD apps and barely at all for performance-critical workloads.

Workload TypeNativeOptimized PWAPractical Gap
Text-heavy / forms / CRUDFastFastNegligible
Image-heavy feeds / scrollExcellentGoodSmall but noticeable
Real-time gaming / AR / VRExcellentPoorLarge
Video editing / heavy computeExcellentLimitedLarge
Battery efficiency (idle/background)BetterWorseMeasurable[4]

Why the Gap Persists for Heavy Workloads

The arXiv study's authors note an important caveat in their own methodology: they could draw no clear conclusion on frame time specifically — meaning for moderate UI work, raw frame-rendering speed wasn't dramatically different.[4] Where native pulls decisively ahead is in sustained, repeated, or hardware-accelerated work: a native app's direct GPU access through Metal (iOS) or Vulkan/OpenGL ES (Android) has no equivalent overhead, whereas a web app's graphics pipeline goes through WebGL or WebGPU — both of which are real and increasingly capable, but still mediated by the browser's compositor.

For developers: if your app's primary workload is forms, lists, and API calls, performance alone is not a strong argument for native. If your app does real-time rendering, signal processing, or anything frame-rate-sensitive, the performance argument for native remains decisive.
§ V

User Experience and Interface Design

Performance numbers tell only part of the story — how an app feels matters as much as how fast it technically is.

Platform Design Languages

Native apps follow platform-specific design conventions that users have learned over years of daily phone use: iOS apps follow Apple's Human Interface Guidelines, with their characteristic spring-physics animations, swipe-back navigation, and SF Symbols iconography. Android apps follow Google's Material Design system, with its own gesture vocabulary, elevation shadows, and motion patterns. Users recognize these patterns instantly and subconsciously, which reduces cognitive friction and increases perceived trustworthiness.[6]

Web apps, by contrast, render the same interface regardless of platform conventions unless a developer deliberately builds platform-aware UI logic — a layer of additional engineering effort that most web teams skip, resulting in interfaces that feel "foreign" on at least one of the two major platforms.

Gestures, Haptics, and Micro-Interactions

Native apps have direct access to the Taptic Engine (iOS) and equivalent Android haptic APIs, enabling the subtle vibration feedback that makes toggling a switch or completing a swipe-to-delete feel satisfying. Native gesture recognizers can be chained, prioritized, and run with zero perceptible latency because they're handled at the OS event-loop level. Web apps can approximate haptics through the navigator.vibrate() API, but support is inconsistent — notably absent on iOS Safari entirely as of this writing — and touch gesture handling in the browser carries additional latency from the browser's own touch-event dispatch pipeline.

Offline-First vs Connection-Dependent Design

A subtler UX dimension: native apps are typically designed offline-first by default, because mobile developers have always had to assume spotty connectivity. Web apps have historically assumed a live connection, and while service workers (covered in §IX) have closed much of this gap, the design instinct often still differs — native teams build for "what happens when this fails," web teams more often build for "the happy path" first.

§ VI

Device and Hardware Access

This is where the architectural gap between native and web translates into the most visible real-world limitations.

What Native Apps Can Always Do

Native apps have unrestricted, first-class access to: the camera and video capture pipeline, GPS with background location updates, Bluetooth (both Classic and Low Energy), NFC for payments and tag scanning, biometric authentication (Face ID, Touch ID, Android BiometricPrompt), the full contacts and calendar databases, background processing and silent push notifications, file system access, and deep OS integration like widgets, Siri Shortcuts, or Android App Actions.[7]

What Web Apps and PWAs Can Do — and Where They Stop

Modern browsers expose a growing set of device APIs: the Web Bluetooth API, Geolocation API, Web Push API, MediaDevices API for camera/microphone, and the File System Access API. On Android, Chrome supports the majority of these well. The real limitation is iOS: Safari's WebKit engine — which, by Apple's App Store policy, every browser on iOS must use under the hood, even Chrome and Firefox — has historically lagged significantly behind Chrome in implementing these APIs.

CapabilityNative (iOS/Android)PWA — Android (Chrome)PWA — iOS (Safari)
Camera / MicrophoneFullFullFull
Push NotificationsFullFullSince iOS 16.4
BluetoothFullFullNot supported
NFCFullPartialNot supported
Background LocationFullLimitedVery limited
Biometric AuthFullWebAuthnWebAuthn
Home Screen InstallN/A — nativeYesYes (iOS 16.4+)

This table is the single most useful reference for a build-vs-buy technical decision: if your product depends on Bluetooth or NFC and you need to reach iOS users, a PWA simply cannot do the job today — no amount of clever engineering changes that, because the API doesn't exist in WebKit.[8]

For Developers — The Permission Model Difference

Native permission requests are persistent and OS-managed — once granted, an iOS or Android app retains camera or location access across sessions until the user explicitly revokes it in Settings. Web permission grants are origin-scoped and, on many browsers, session-limited or revocable far more casually by the user, which means web apps frequently have to re-request permissions that a native app would only ask for once.

§ VII

Distribution, Discovery, and SEO

The App Store Funnel

Native apps are discovered primarily through the App Store and Google Play — search, category browsing, featured placements, and word-of-mouth driving a download. This funnel has real friction: a user must find the app, tap "Get," wait for download and install, then open it — every additional step loses a percentage of potential users. Apple and Google both also impose a mandatory review process before an app — or any update to it — goes live, typically taking anywhere from a few hours to several days, occasionally longer for apps that touch sensitive categories like health data, cryptocurrency, or AI.

The Web's Built-In Discoverability

Web apps are discoverable the way any website is: through search engines. A PWA's content can be indexed by Googlebot and ranked in organic search results — something an app's internal content fundamentally cannot do, since app stores don't index in-app content the way Google indexes web pages.[9] This is a structural advantage for any product where organic discovery matters: content publishers, e-commerce catalogues, documentation sites, and marketplaces.

Web apps are also instantly shareable — a single URL works as a complete distribution mechanism via text message, social post, QR code, or email link, with zero install friction for the recipient to get a first look. Pinterest leaned directly into this advantage when redesigning their mobile experience as a PWA, explicitly citing that a large share of their traffic arrived from shared links and social referrals that a native-app-only strategy would have lost entirely at the front door.[10]

How People Actually Spend Their Time — the Usage Gap

Despite the web's discovery advantages, once a user is engaged, behavioural data consistently shows a strong pull toward native apps for sustained use. Sensor Tower's State of Mobile 2026 report found that users spend less than 6% of total smartphone time in mobile browsers — meaning roughly 94% of smartphone time happens inside native apps.[11] This figure has been independently corroborated by comScore across multiple years and markets, consistently showing app usage dominating mobile-web usage by a wide margin once a user has the app installed.[12]

The practical reconciliation of these two facts — web apps win at discovery, native apps win at retention — is why most serious consumer products eventually pursue both: a fast, SEO-friendly, installable web experience to capture and convert new users cheaply, paired with a native app to deepen engagement, retention, and monetization for the users who stick around.

Conversion Rate Differences

This usage gap translates directly into commerce outcomes. Apps convert at roughly 3× the rate of mobile websites in e-commerce, with app users viewing 286% more products per session than mobile web users in the same category, according to Criteo and Button data compiled in 2025–2026 industry analysis.[13] The reasons are practical rather than mysterious: apps load faster on repeat visits (cached locally rather than re-fetched), they remember user preferences and saved payment details more reliably, and they remove friction at checkout that a fresh, cookie-less mobile browser session often reintroduces.

§ VIII

Cost, Codebases, and Development Timelines

The Two-Codebase Problem

Pure native development for both platforms means two separate teams, two separate languages (Swift for iOS, Kotlin for Android), two separate design-asset pipelines following different platform guidelines, and two separate QA and release cycles. This is the single biggest driver of cost: building and maintaining feature parity across two codebases routinely costs 2–3 times more than a single shared codebase, and that multiple compounds with every feature added over the product's lifetime, not just at initial launch.[14]

The Web's Single-Codebase Advantage

A web app — and by extension a PWA — uses one codebase that runs identically on every device with a modern browser: desktop, mobile, tablet, even smart TVs in some cases. One engineering team, one test suite, one deployment pipeline. This isn't just a cost saving at launch; it dramatically lowers the marginal cost of every subsequent feature, since there's no risk of platform-specific implementation drift between an iOS build and an Android build of the same feature.

Where Cross-Platform Frameworks Sit

For teams unwilling to accept either the full native cost or the full web performance trade-off, cross-platform native frameworks occupy a deliberate middle ground:

  • React Native — shared JavaScript/TypeScript business logic and UI declarations, compiled to genuine native UI components at runtime via a bridge (or the newer JSI architecture for direct native calls). Mature ecosystem, used at scale by Meta, Shopify, and Discord.
  • Flutter — shared Dart codebase, custom rendering engine (Skia/Impeller) draws every pixel itself rather than using native widgets, giving extremely consistent cross-platform behaviour and near-native performance even for animation-heavy UIs.
  • Kotlin Multiplatform (KMP) — shares only the non-UI business logic (networking, data persistence, validation) while keeping UI fully native and idiomatic on each platform — a "share what's safe to share" philosophy increasingly favoured by teams that prioritize platform-perfect UI over maximum code sharing.

None of these eliminate cost entirely — there is still a learning curve, occasional platform-specific edge cases requiring native code "escape hatches," and ecosystem maturity differences between frameworks — but all three meaningfully reduce the 2–3× multiplier of pure native development while retaining most of native's performance and hardware access.

Update Velocity — The Iteration Speed Difference

This is one of the most underappreciated cost dimensions. A bug fix in a web app goes live the moment it's deployed — every user, instantly, with zero action required from them. A bug fix in a native app requires building a new binary, submitting it for app store review, waiting for approval, and then waiting again for users to actually download the update — meaning a critical fix can remain unresolved for a meaningful share of your user base for days or weeks after the "fix" technically shipped.[15] For teams that iterate rapidly or need to respond quickly to production incidents, this is a genuine, recurring operational cost of the native model that rarely shows up in initial budget estimates.

§ IX

Offline Capability and Local Storage

Native — Offline by Default

Native apps store data locally using the platform's native persistence layers — Core Data or SwiftData on iOS, Room (built on SQLite) on Android — with effectively unlimited storage bounded only by device capacity, and full background sync control through OS-level background task scheduling APIs.

The Service Worker Model

The technology that made offline-capable web apps possible is the Service Worker — a JavaScript file that runs in a separate thread from the main page, acts as a programmable network proxy between the browser and the internet, and can intercept fetch requests to serve cached responses when there's no connection. Combined with the Cache API for storing network responses and IndexedDB for structured client-side data storage, a well-engineered PWA can genuinely function offline — caching the app shell, recently viewed content, and queueing user actions, like a draft order or a form submission, to sync once connectivity returns.

// Minimal service worker offline-first cache strategy self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(cached => cached || fetch(event.request)) ); });

Where Web Offline Still Falls Short

Browser storage quotas are real and platform-dependent — Safari on iOS has historically been the most aggressive about evicting cached data when device storage runs low, sometimes clearing an entire PWA's offline cache without warning if the user hasn't opened it recently. Background sync, the API that lets a web app finish an upload or sync after the tab is closed, has inconsistent cross-browser support and no equivalent of native's reliable background task scheduling on iOS specifically. For applications where offline reliability is mission-critical — field service apps, logistics, healthcare data capture in low-connectivity environments — native still provides materially stronger guarantees.

Real-World PWA Offline Success

Starbucks' PWA is frequently cited as a best-in-class implementation: it lets customers browse the full menu and build an order entirely offline, syncing the order the moment connectivity returns — a deliberate design choice that accounted for the patchy cellular and WiFi conditions common inside stores and subways.[16] This demonstrates the offline ceiling for web technology is high enough for most consumer use cases when deliberately engineered for — the gap is in reliability guarantees and edge-case robustness, not raw capability.

§ X

Monetization and App Store Economics

The App Store Tax

Every native app selling digital goods or subscriptions through Apple's App Store or Google Play is subject to a platform commission. Apple charges 30% on in-app purchases, reduced to 15% for developers earning under $1 million per year through its Small Business Program. Google's standard rate is 15% on the first $1 million of annual revenue, then 30% thereafter.[17] For subscription businesses, SaaS products, and digital content sellers, this commission is a permanent, recurring tax on revenue that doesn't exist for an equivalent transaction processed through a web app's own payment integration — a Stripe or PayPal checkout on the open web typically costs 2–3% in processing fees, an order of magnitude less.

Why Many Apps Still "Pay the Tax" Anyway

Despite the cost, app store distribution remains valuable for discovery, built-in trust signals (app store ratings and reviews function as social proof), and frictionless one-tap purchasing using a payment method the user has already saved to their Apple ID or Google account. Many consumer subscription apps — Netflix being the most famous example — have responded by steering users to subscribe via the company's own website rather than in-app, retaining the app for usage but routing payment around the platform commission entirely, a practice now more explicitly permitted following regulatory pressure in multiple jurisdictions.

Web Apps — Full Payment Freedom, Less Built-In Trust

A web app has complete freedom over its payment stack and pricing — no mandatory commission, full control over checkout UX, and the ability to use any payment processor or even cryptocurrency. The trade-off is the absence of the one-tap, biometric-authenticated purchase flow native users have grown accustomed to, and the absence of the implicit trust signal an app store listing provides to a first-time user evaluating whether to hand over a credit card.

§ XI

Security, Privacy, and Trust

App Store Vetting

Both Apple and Google run automated and manual review processes before an app reaches their store, scanning for malware, undisclosed data collection, policy violations, and impersonation. This isn't a perfect filter — malicious apps occasionally slip through both stores — but it provides a meaningful baseline layer of vetting that the open web, by design, does not have: anyone can register a domain and publish a web app instantly, with no review step at all.

The Sandboxing Model

Both native apps and web pages run in sandboxed environments, but the sandboxes differ in scope. A native app's sandbox restricts file system access and inter-process communication, but once a permission (camera, location, contacts) is granted, the app has relatively broad ongoing access within that permission's scope. A web page's sandbox is, by design, far more restrictive by default — same-origin policy, CORS restrictions, and the browser's own process isolation mean a malicious website has a much smaller attack surface against the user's device than a malicious native app that's somehow passed app store review.

Update-Driven Security Posture

This connects back to the update-velocity point in §VIII: a critical security vulnerability discovered in a web app can be patched and deployed to 100% of users within minutes. The same vulnerability in a native app requires the full app-store-submission-and-user-download cycle, during which a meaningful share of the user base remains exposed on an old, vulnerable binary — a real and often underweighted security trade-off in the native-vs-web decision.

§ XII

Real-World Case Studies

Abstract trade-offs are useful, but real companies betting real revenue on these decisions provide the clearest evidence of what actually happens in production.

PWA Migration · Social Discovery Platform

Pinterest

Pinterest rebuilt its mobile web experience from the ground up as a Progressive Web App, explicitly motivated by the observation that only about 1% of their mobile web visitors were converting into sign-ups, logins, or app installs — performance on the old mobile site was identified as a primary cause.[10]

+103% weekly active users +44% user-generated ad revenue +60% core engagement +40% time spent vs old mobile web
PWA Launch · Social Media

Twitter Lite

Built specifically to serve users on slow networks and low-storage devices in emerging markets, Twitter Lite was engineered around an aggressively small initial payload and an offline-first service worker architecture.

−70% data usage +65% pages per session
PWA · Retail / Offline-First

Starbucks

Starbucks built a PWA explicitly designed to let customers browse the full menu and assemble an order while fully offline — accounting for the patchy connectivity typical inside physical stores — syncing the completed order automatically the moment a connection becomes available again.[16]

Native-First · Mobile-Native Workflows

Instagram, Uber, WhatsApp, Spotify

These products share a common thread: their core value proposition is inseparable from device hardware and continuous background activity. Instagram's camera-first capture flow, Uber's continuous background GPS tracking during a ride, WhatsApp's deep contacts and notification integration, and Spotify's offline audio caching for uninterrupted playback are all use cases where the native performance and hardware-access advantages aren't marginal — they're foundational to the product working at all.[1]

The pattern across every case study here is consistent: companies that moved toward PWAs did so for content-discovery and low-friction-acquisition products. Companies that stayed firmly native did so because their core product loop depends on sustained, reliable hardware access. Neither group made the "wrong" choice — they made the choice that matched their product's actual technical requirements.
§ XIII

A Practical Decision Framework

Having walked through every technical and business dimension, here is a condensed, practical framework for making the actual call.

Choose Native When
  • Your core feature depends on Bluetooth, NFC, or deep background location tracking
  • Performance is non-negotiable — gaming, AR/VR, video editing, real-time signal processing
  • You need the smoothest possible animations and platform-perfect feel
  • Offline reliability is mission-critical with zero tolerance for sync failures
  • App store presence itself is a trust and discovery requirement for your category
  • You have budget for 2–3× the engineering investment, ongoing
Choose Web / PWA When
  • Organic search discovery (SEO) is a primary acquisition channel
  • You need to validate a product quickly with minimal upfront investment
  • Your core workload is content, forms, dashboards, or CRUD-style interactions
  • Instant updates and rapid iteration matter more than peak performance
  • Cross-platform reach (including desktop) from day one is important
  • You want to avoid app store commissions on transactions

The Hybrid Reality Most Products Land On

In practice, most mature consumer products don't choose one path exclusively — they run a web presence (for SEO, low-friction trial, and desktop access) alongside a native or cross-platform-native app (for engaged, retained users who want the deepest experience). The web property becomes the top of the funnel; the native app becomes the retention and monetization engine. This isn't a compromise so much as a recognition that discovery and engagement are genuinely different jobs, best served by genuinely different technology.

For Developers — A Quick Technical Checklist

  • Does the product need Bluetooth, NFC, or background location on iOS specifically? → Native required, no PWA workaround exists today.
  • Is the UI primarily lists, forms, and content? → PWA or React Native will perform indistinguishably from fully native for the vast majority of users.
  • Is animation fidelity and 120fps consistency core to the brand feel? → Flutter or fully native; avoid WebView-based hybrid wrappers.
  • Is the team small and the runway short? → Web/PWA first, defer native investment until product-market fit is proven.
  • Is SEO or content shareability a primary growth lever? → Web/PWA is structurally necessary, regardless of other factors.
§ XIV

Where This Is Heading

The native-versus-web boundary has been eroding steadily for a decade, and every indicator suggests that trend continues rather than reverses.

Browser Capability Is Still Expanding

WebGPU — the successor to WebGL, giving web apps far more direct access to modern GPU compute capabilities — is now shipping in major browsers. The File System Access API, Web Bluetooth, and WebAuthn continue to mature. Each release narrows the specific list of things "only native can do," even as the list never reaches zero.

iOS Remains the Long Pole

Nearly every capability gap discussed in this article — Bluetooth, NFC, robust background sync, aggressive cache eviction — traces back to Safari/WebKit's comparatively conservative pace of adopting new web platform capabilities on iOS, often attributed to Apple's strategic interest in keeping the App Store's value proposition intact. Regulatory pressure in the EU under the Digital Markets Act has already forced some loosening — including allowing alternative browser engines on iOS in the EU — and the long-term trajectory of that regulatory pressure will likely shape how quickly the remaining gaps close more than any pure technical constraint will.

The Convergence of Cross-Platform Native

Flutter and React Native continue to mature toward genuinely indistinguishable-from-native performance for an ever-widening share of use cases, while Kotlin Multiplatform's "share logic, keep native UI" philosophy is gaining serious enterprise adoption as a way to get cost savings without sacrificing platform-perfect feel. The practical effect: the cost penalty of going native, specifically, continues to shrink even for teams that don't choose the pure web path.

The Honest Long-Term Picture

It is unlikely that either native or web "wins" outright in any near-term future. What's far more likely is what we already see today: a continued narrowing of the performance and capability gap for ordinary applications, alongside a persistent, durable gap for hardware-intensive and performance-critical workloads where the architectural cost of an interpretation layer simply cannot be fully eliminated. The strategic question for any team, then as now, isn't "which is better" — it's "which trade-offs match what we're actually building."