AV
angelvelasquez.dev
Mobile Systems September 22, 2026 • 8 min read

Kotlin Multiplatform (KMP 2.1) vs TWA vs Capacitor: Enterprise Mobile Decision Matrix

A pragmatic engineering evaluation of native logic sharing vs hybrid packaging for enterprise deployments across Google Play and Apple App Store.

#Kotlin 2.1 #KMP #Android TWA #Capacitor #iOS #Google Play #App Store

Enterprise mobile engineering is often plagued by dogmatism. Teams debate endlessly between “100% native or nothing” and “Flutter/React Native rewrites”, ignoring the business constraints of enterprise deployments: existing web platforms, corporate authentication, offline resilience, and store policy compliance.

In production, the right answer is determined by operational constraints. Here is the architectural decision matrix comparing Kotlin Multiplatform (KMP 2.1), Android Trusted Web Activities (TWA), and Capacitor 6/7, based on real-world systems deployed to Google Play and the Apple App Store.


1. Architectural Comparison Matrix

DimensionKotlin Multiplatform (KMP 2.1)Android TWACapacitor 6/7 (iOS / Android)
Code Sharing ScopeBusiness logic, state machines, network, database (70-80%)100% (Renders existing web app via Chrome Custom Tab)90-95% (Web frontend wrapped in native WebView container)
UI ImplementationCompose Multiplatform or Native UI (Jetpack Compose / SwiftUI)Web DOM (HTML/CSS/JS) executed by Chrome engineWeb DOM rendered in WebKit / Chromium
Offline CapabilityNative local SQLite (SQLDelight / Room) + local encryptionRequires dedicated Service Worker + offline caching fallbackService Worker or local device asset storage
Store Footprint~5 MB - 15 MB< 2 MB (Wrapper APK/AAB)~5 MB - 8 MB
Device Hardware AccessDirect Native (Bluetooth, USB, foreground services, sensors)Limited to Web APIs (Web Bluetooth, Web Push)Native plugins via TypeScript bridge or custom Swift/Kotlin
Store Scrutiny RiskMinimal (Standard native binary)Moderate (Requires Digital Asset Links verification)Moderate (Requires PrivacyInfo.xcprivacy and clear utility)

2. Deep Dive: Kotlin Multiplatform (KMP 2.1) for Logic-Heavy Apps

When an application requires native UI smoothness, background processing, or complex local synchronization, KMP 2.1 is the strongest architectural choice. It allows sharing data models, API clients, and offline databases while leaving UI code to the platform’s native toolkits:

// shared/src/commonMain/kotlin/com/wiser/meeting/data/MeetingRepository.kt
package com.wiser.meeting.data

import kotlinx.coroutines.flow.Flow
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.get

class MeetingRepository(
    private val client: HttpClient,
    private val localDatabase: MeetingDao
) {
    fun observeMeetings(): Flow<List<MeetingEntity>> = localDatabase.getAllAsFlow()

    suspend fun syncMeetings(workspaceId: String): Result<Unit> = runCatching {
        val remoteMeetings = client.get("https://api.internal/workspaces/$workspaceId/meetings")
            .body<List<MeetingDto>>()
        
        localDatabase.transaction {
            remoteMeetings.forEach { localDatabase.insertOrUpdate(it.toEntity()) }
        }
    }
}

When to Choose KMP

  • You need high-performance offline database syncing (SQLDelight + Ktor).
  • You are integrating low-level hardware APIs (Bluetooth, peer-to-peer Wi-Fi sockets, biometric keystore).
  • You have distinct UI design requirements on Android (Material 3) and iOS (Human Interface Guidelines).
  • Production Reference: Implemented in Wiser Meeting KMP (+75% shared Kotlin logic across platforms) and MacMirror (peer-to-peer AES-256 local daemon).

3. Trusted Web Activities (TWA): Zero-Cost Production Velocity on Android

For companies with an existing, responsive enterprise web portal, rewriting the application natively is often economically unjustifiable. Android TWA enables packaging the web application as a first-class APK/AAB verified with cryptographic Digital Asset Links:

[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "com.magnetsolutions.panaservice",
      "sha256_cert_fingerprints": [
        "14:6D:E9:FD:9D:47:89:15:37:34:64:18:F7:56:47:77:E5:A9:1B:44:81:49:FF:78:E8:4A:23:44:03:07:44:7E"
      ]
    }
  }
]

Key Technical Advantages of TWA

  1. Fullscreen Chrome Engine: Runs without browser address bars, utilizing the user’s latest installed Chrome version and hardware acceleration.
  2. Instant Web Deployments: Frontend updates deployed to your web server appear immediately in the installed app without waiting for Google Play review cycles.
  3. Resilience via Service Worker: By pairing the TWA with an aggressive caching Service Worker (sw.js) and a graceful offline.html fallback, field workers in remote locations (mines, industrial plants) maintain usability even with severed connectivity.

4. Capacitor 6/7 on iOS: Solving Enterprise Distribution

While TWA is native to Android, iOS does not support TWA. Capacitor bridges this gap for Apple devices, embedding the web application inside a hardened WebKit WKWebView container while providing full access to native Swift plugins.

Crucial iOS Requirements for Enterprise Approval

  1. Apple Privacy Manifest (PrivacyInfo.xcprivacy): Mandatory under current App Store guidelines. Every API accessing UserDefaults, system boot times, or disk space must be explicitly declared with approved Apple reason codes (e.g., CA92.1).
  2. Unlisted App Distribution: For B2B or corporate intranet apps that must not be searchable on the public App Store, Apple provides the Unlisted App channel. The app passes standard App Store review but is accessible exclusively via a private URL, eliminating the need for expensive and intrusive Mobile Device Management (MDM) software on personal employee devices.

5. Production Case: The Panaservice Ecosystem

In the Panaservice Mobile Enterprise Deployment, I combined these architectures to deliver a unified corporate mobile client across both stores under corporate Organization developer accounts:

  • Android: TWA packaged under com.magnetsolutions.panaservice with cryptographic assetlinks validation and Service Worker offline caching.
  • iOS: Capacitor 6 with custom WebKit keyboard accessories, universal links (apple-app-site-association), and automated CI/CD via Xcode Cloud. Approved under Apple Unlisted Distribution (id6801614913).
  • Outcome: 100% employee adoption, instant updates without re-review cycles, and zero licensing costs.

Pragmatic Decision Framework

Do you require low-level hardware APIs or 60fps animations?
├── YES ──> Kotlin Multiplatform (KMP 2.1) + Native UI
└── NO
    └── Do you have an established responsive web application?
        ├── Android ──> Trusted Web Activity (TWA) + Digital Asset Links
        └── iOS ──> Capacitor 6/7 + Xcode Cloud CI/CD + Unlisted Distribution