A stack decision is long-term — mobile apps live three to five years, often longer. We choose per project, deliberately and with justification, instead of forcing a house preference.
.NET MAUI
React Native
Swift / SwiftUI
Kotlin / Jetpack Compose
Expo
SQLite
Realm / WatermelonDB
OAuth 2.0 / OIDC
Microsoft Entra ID
Microsoft Intune
Microsoft Dataverse
Apple Push (APNs)
Firebase Cloud Messaging
App Center / Sentry
Fastlane
GitHub Actions
.NET MAUI · for Microsoft-adjacent stacks
Microsoft's cross-platform framework, successor to Xamarin Forms. One C# codebase covers iOS, Android, macOS, and Windows. Makes sense when you already use Dynamics 365, Power Platform, or a .NET backend stack — the auth libraries (MSAL), Dataverse connectivity, and Microsoft identity story are most mature here. Our default for B2B field apps with Microsoft integration.
React Native · for broad cross-platform projects
JavaScript/TypeScript-based framework from Meta, with the largest ecosystem of open-source components. Makes sense when the web team thinks in TypeScript and code sharing between web and mobile is useful (e.g. validation logic, API clients). We typically use it with Expo, which simplifies build tooling and update pipelines.
Native Swift / Kotlin · when the task demands it
When AR features (ARKit / ARCore), CoreML inference on the device, professional audio/video processing, or pixel-perfect UI animations are required, there's no alternative to native development. SwiftUI for iOS, Jetpack Compose for Android. Here we deliver single-platform — higher effort, but maximum platform depth.
Data persistence · SQLite and sync engines
Offline-capable apps need a local data store, typically SQLite — directly or via Realm or WatermelonDB. We choose sync strategies (last-write-wins, operational transforms, CRDTs) based on conflict tolerance. For Microsoft Dynamics 365 / Dataverse-backed apps we use the Microsoft Field Service sync mechanism or build a custom one if necessary.
Identity · OAuth 2.0 with Microsoft Entra ID
Authentication runs via OAuth 2.0 with PKCE; tokens are stored in the platform's own secure storage (Keychain on iOS, Keystore on Android). For Microsoft integration we use MSAL (Microsoft Authentication Library), which brings Conditional Access, MFA, and single sign-on out of the box.