PROPELOO

REACT NATIVE / CROSS-PLATFORM MOBILE

One codebase. Two platforms. No compromises on performance.

PROPELOO engineers React Native applications — from architecture and native module integration through performance optimisation, CI/CD and App Store delivery. React Native done well is indistinguishable from a native app. React Native done badly is a slow, janky app that users delete. The difference is entirely in how the engineering is approached.

The performance gap between a well-built React Native app and a poorly-built one is larger than the gap between React Native and native.

React Native's reputation for poor performance comes almost entirely from apps built without understanding the bridge architecture — components that re-render on every state change, images loaded without caching, FlatLists without proper optimisation, animations running on the JS thread instead of the UI thread. A React Native app built with the new architecture (JSI, Fabric, TurboModules), proper list virtualisation, Reanimated 3 for 60fps animations and a well-designed state management layer performs identically to a native app for 95% of use cases. PROPELOO builds React Native apps that make users forget they are not native — because the engineering underneath them is.

The full React Native engineering stack.

A production React Native app is not just a cross-platform UI layer. It is a native integration layer, a performance optimisation system and a CI/CD pipeline.

System Layers

  • Architecture Layer: New Architecture (JSI/Fabric/TurboModules), navigation structure, state management, module boundaries
  • UI & Animation Layer: Component library, Reanimated 3 for 60fps animations, gesture handling, design system
  • Native Integration Layer: Native modules for device APIs, camera, biometrics, push notifications, background tasks
  • Data & Network Layer: API client, caching strategy, offline support, optimistic updates, sync logic
  • DevOps Layer: EAS Build, CI/CD, OTA updates (Expo Updates), crash reporting, App Store submission

Core Technical Capabilities

  • App Architecture

    Feature-based folder structure, React Navigation v7 for navigation, Zustand or Redux Toolkit for state, React Query for server state, TypeScript throughout and a clear module boundary strategy.

  • Performance Engineering

    FlatList/FlashList optimisation with proper keyExtractor and getItemLayout, memo and useMemo for expensive renders, Reanimated 3 for UI-thread animations, image caching with FastImage, and JS bundle splitting.

  • Native Module Development

    Custom native modules in Swift/Kotlin for device capabilities not covered by existing libraries — BLE integration, custom camera processing, hardware peripheral communication, platform-specific features.

  • Offline & Sync

    SQLite or MMKV for local persistence, background sync with retry logic, conflict resolution for optimistic updates and network state management for graceful degradation.

  • Authentication & Security

    Biometric authentication (Face ID/Touch ID), secure keychain storage for tokens, certificate pinning, jailbreak/root detection and encrypted local database for sensitive data.

  • CI/CD & Deployment

    EAS Build for cloud builds, EAS Submit for App Store/Play Store submission, EAS Update for OTA hotfixes, GitHub Actions CI pipeline with automated testing and code signing.

How we think about React Native development.

React Native is not a shortcut to building two apps at once. It is a different set of engineering tradeoffs that require different expertise than either native iOS or native Android.

  • New Architecture is not optional for production

    The old React Native bridge architecture — where every JS-to-native call was serialised and queued — is the source of most React Native performance problems. The New Architecture (JSI for direct JS-to-native calls, Fabric for synchronous UI operations, TurboModules for lazy-loaded native modules) eliminates the bridge bottleneck. New apps should start with the New Architecture. Existing apps should migrate before scaling.

    Axiom:

  • Animations must run on the UI thread

    Animations that run on the JavaScript thread (using the Animated API with useNativeDriver: false) will drop frames whenever the JS thread is busy — which is always during data fetching, state updates and user interactions. Reanimated 3 runs animations on the UI thread in a separate worklet runtime, producing 60fps animations regardless of JS thread load. Every meaningful animation in a production app should use Reanimated 3.

    Axiom:

  • List performance is the most common production problem

    A FlatList rendering 1,000 items without windowSize, maxToRenderPerBatch and removeClippedSubviews configured will crash on low-end Android devices. FlashList (from Shopify) provides a drop-in replacement with significantly better performance for most use cases. List performance must be tested on low-end Android devices — not on a simulator or a flagship iPhone.

    Axiom:

  • Expo vs bare React Native is a team question

    Expo Managed Workflow eliminates build configuration complexity and provides EAS Build for CI/CD without a Mac. Bare React Native gives full control over native code. The deciding factor: does the app require native modules not available in Expo? If not, Expo Managed Workflow is the correct choice for 80% of production apps — faster development, simpler CI/CD and OTA update capability.

    Axiom:

The React Native decisions that define app quality.

Each choice affects performance, developer experience and long-term maintainability.

  • Expo vs bare React Native?

    Impact: Expo Managed with EAS Build for most apps. The Expo SDK covers 95% of common native requirements. Bare React Native only when custom native modules are genuinely required.

    • Expo Managed — no native config, EAS Build, OTA updates, limited to Expo SDK modules
    • Expo Bare — partial Expo tooling, some native config, more flexible
    • Bare React Native — full native control, requires Mac for iOS builds, most flexible
    • React Native + manual config — maximum control, maximum configuration burden
  • State management?

    Impact: Zustand for most apps. Redux Toolkit for apps with complex state that benefits from Redux DevTools and time-travel debugging. React Query/TanStack Query for server state — separate from client state management.

    • Zustand — lightweight, hooks-based, minimal boilerplate, correct for most apps
    • Redux Toolkit — verbose but explicit, good for complex state, large team familiarity
    • Jotai / Recoil — atomic state, good for complex derived state
    • Context API only — fine for small apps, performance issues at scale
  • Navigation?

    Impact: React Navigation v7 is the standard. Expo Router for apps that need URL-based routing and deep linking from day one. React Native Navigation only for apps with very complex navigation performance requirements.

    • React Navigation v7 — community standard, native stack, drawer, tabs, type-safe routes
    • Expo Router — file-based routing, URL-based deep linking, newer but growing
    • React Native Navigation (Wix) — native navigation, better performance, more complex setup
  • Animation library?

    Impact: Reanimated 3 for any animation that runs on user interaction or needs 60fps. Lottie for static illustration animations. Animated API only for very simple opacity/transform animations with useNativeDriver: true.

    • Reanimated 3 — UI-thread animations, worklets, gesture integration, correct choice
    • Animated API (built-in) — simple, useNativeDriver for basic animations only
    • Lottie — JSON animations, good for complex illustrations
    • Skia (React Native Skia) — custom drawing, complex graphics
  • Local data persistence?

    Impact: MMKV for settings, tokens and small data structures. op-sqlite (SQLite) for structured data that needs querying. Never use AsyncStorage for anything security-sensitive — it is unencrypted.

    • AsyncStorage — simple key-value, slow for large data, not encrypted
    • MMKV — 10-30x faster than AsyncStorage, encrypted, correct for most apps
    • SQLite (op-sqlite) — relational queries, good for complex structured data
    • Realm — object database, real-time sync available, heavier dependency
  • Testing approach?

    Impact: Jest + RNTL for unit/component tests (run in CI on every commit). Maestro or Detox for E2E tests of critical user journeys. E2E tests on every commit are too slow — run nightly or on release branches.

    • Jest + React Native Testing Library — unit and component tests, fast
    • Detox — end-to-end on real device/simulator, slow but realistic
    • Maestro — newer E2E framework, simpler syntax than Detox, mobile-first
    • No automated testing — fastest short-term, riskiest long-term

What PROPELOO builds.

  • FinTech Mobile App

    Banking, payments or investment app with biometric auth, secure keychain, real-time data, push notifications and App Store/Play Store compliance.

  • E-commerce App

    Product catalogue, cart, checkout with Stripe/Razorpay, order tracking, push notifications and deep linking from marketing campaigns.

  • Healthcare App

    Patient-facing app with appointment booking, telehealth video, secure messaging, health data integration (HealthKit/Google Fit) and HIPAA-compliant data handling.

  • On-demand Service App

    Marketplace app with real-time location tracking, map integration, in-app payments, rating system and background location for delivery tracking.

  • Web3 Wallet App

    Crypto wallet with Secure Enclave key storage, WalletConnect, multi-chain support, NFT display, biometric confirmation for transactions and ERC-4337 support.

  • SaaS Mobile Client

    Mobile companion for a web SaaS — offline-capable, real-time sync, role-based access, deep linking and feature parity with the web application.

The React Native stack.

Navigation, state, animation and CI/CD each require specific tooling choices.

  • Core

    Stack: React Native (New Architecture), TypeScript, Expo (Managed/Bare), React Navigation v7, Expo Router

  • State & Data

    Stack: Zustand, Redux Toolkit, TanStack Query, MMKV, op-sqlite

  • UI & Animation

    Stack: Reanimated 3, React Native Gesture Handler, React Native Skia, Lottie, NativeWind (Tailwind)

  • Native Modules

    Stack: Expo Camera, React Native Biometrics, React Native Keychain, react-native-maps, Notifee (push)

  • CI/CD

    Stack: EAS Build, EAS Submit, EAS Update (OTA), GitHub Actions, Fastlane

  • Monitoring

    Stack: Sentry, Firebase Crashlytics, Firebase Analytics, Datadog Mobile

Mobile app security requires platform-specific approaches.

iOS and Android have different security models and different attack surfaces.

  • Secure Token Storage

    Auth tokens stored in AsyncStorage are readable by any process with file system access on a rooted/jailbroken device. Tokens must be stored in iOS Keychain or Android Keystore via react-native-keychain — hardware-backed secure storage.

  • Biometric Authentication

    Face ID and Touch ID must use the platform Secure Enclave for key operations — not just as a UI gate that can be bypassed. React Native Biometrics wraps the platform APIs correctly. Jailbreak/root detection adds a second layer.

  • Certificate Pinning

    Man-in-the-middle attacks on mobile apps intercept TLS traffic by installing a custom root CA. Certificate pinning validates the server certificate against a hardcoded hash, preventing interception even on compromised networks. Required for apps that handle financial or health data.

  • Reverse Engineering Protection

    React Native JS bundles can be extracted and read from APK/IPA files. Hermes bytecode compilation (default in new RN) provides some obfuscation. Metro bundle encryption for additional protection of business logic in the JS layer.

  • Deep Link Security

    Universal Links (iOS) and App Links (Android) must be properly configured to prevent other apps from intercepting deep links. Deep link handlers must validate all parameters before using them — deep links are user-controlled input.

  • Data at Rest

    Sensitive data stored locally (cached API responses, user PII, documents) must be encrypted. SQLite with SQLCipher or MMKV with encryption enabled. Clear-text sensitive data in the app sandbox is accessible on rooted devices.

From design to App Store.

  1. 01. Architecture Design

    Navigation structure, state management, module boundaries, native module requirements and CI/CD approach.

  2. 02. Project Setup

    Expo/RN scaffold, TypeScript config, ESLint/Prettier, navigation setup, state management, API client and CI pipeline.

  3. 03. Core Feature Development

    Screen development in 2-week sprints. Performance testing on low-end Android throughout development.

  4. 04. Native Integration

    Biometrics, push notifications, camera, location, payments and any custom native modules.

  5. 05. Performance & Polish

    Animation refinement, list performance optimisation, image caching, startup time reduction and accessibility audit.

  6. 06. Testing & QA

    Jest unit tests, Maestro E2E tests, manual QA on physical devices (iPhone SE, mid-range Android).

  7. 07. App Store Submission

    App Store and Play Store submission via EAS Submit, review preparation, metadata and OTA update infrastructure.

Frequently Asked Questions

Is React Native as performant as native?

For 95% of app use cases: yes, with the New Architecture. The JSI (JavaScript Interface) eliminates the old asynchronous bridge, enabling synchronous JS-to-native communication. Fabric enables synchronous UI operations. With Reanimated 3 for animations (running on the UI thread) and proper list virtualisation, users cannot tell the difference from native. The remaining 5%: extremely graphics-intensive applications (games, AR) where native OpenGL/Metal access is required.

Should we use Expo?

For most apps: yes. Expo Managed Workflow eliminates native build configuration, provides EAS Build (cloud builds without requiring a Mac), EAS Update (OTA updates without App Store review) and a comprehensive SDK covering camera, biometrics, notifications, maps and 100+ other APIs. The main reason not to use Expo: a native module not available in the Expo SDK that genuinely cannot be replaced. This applies to fewer than 10% of production apps.

What is OTA (Over The Air) update and how does it work?

OTA updates (via Expo EAS Update or CodePush) allow pushing JS bundle updates to installed apps without going through App Store review. This is possible because the native shell of the app does not change — only the JavaScript code. OTA updates can fix bugs and ship features to users in minutes rather than days. Apple and Google permit OTA updates as long as they do not change the fundamental nature of the app or add significant new functionality.

How do we handle offline functionality?

Offline support requires: local database (MMKV or SQLite) for caching API responses, a sync layer that queues mutations made offline and replays them when connectivity returns, conflict resolution strategy for concurrent edits, and UI that clearly communicates offline state. MMKV for simple caching. SQLite for complex relational data. TanStack Query handles optimistic updates well. Full offline-first architecture (like CRDTs) is complex and only needed for specific use cases.