Skip to main content
reopt Handbook
reopt Handbook
Expo Enterprise Production

New Architecture

SDK 56 Breaking ChangesNew Architecture Deep DiveReact 19.2 Concurrency Patterns

Native Extensions

Expo UI Nativeexpo-widgets Home Screen WidgetsExpo Modules API v2 Native Extensions

Build and Release

Advanced EAS Build PipelinesEAS Update OTA StrategySecurity, Signing, and Compliance

Operations and Quality

Performance Monitoring and ProfilingTesting StrategyEnterprise Distribution and MDM

Appendix

Verification ReportUpdates
Handbook›Expo Enterprise Production›Expo Modules API v2 Native Extensions
한국어English

Expo Modules API v2 Native Extensions

Swift/Kotlin modules, inline modules, type generation, and testing strategy.

Key takeaways

  • SDK 56 adds a faster path from app-local native experiments to reusable modules, including experimental inline Kotlin/Swift files that autolink from app directories.
  • expo-type-information generates TypeScript interfaces from Swift modules, and a Kotlin compiler plugin lowers Android reflection overhead.
  • Choose inline modules for one-app capabilities and local or standalone Expo modules once the capability is reused across apps.
  • Enable inline modules via experiments.inlineModules.watchedDirectories, then regenerate native projects with npx expo prebuild.
  • Keep a typed requireNativeModule wrapper instead of leaking any, and treat native runtime changes as binary releases, not OTA-only changes.

What Changed in SDK 56

Expo Modules now support a faster path from app-local native experiments to reusable modules. Teams can start with inline native files and promote them into local or standalone modules when reuse, versioning, or ownership requires it.

FeatureStatusProduction meaning
Inline modulesSDK 56 experimentalKotlin and Swift files can live in app directories and be autolinked
expo-type-informationSDK 56Generate TypeScript interfaces from Swift modules
create-expo-module improvementsSDK 56Better local/standalone scaffolding and non-interactive flows
Kotlin compiler pluginSDK 56Lower reflection overhead for Android Expo Modules
iOS JSI layer improvementsSDK 56Simpler Swift-to-JSI call path

Selection Guide

SituationRecommendation
Thin native capability used by one appInline module
Capability reused across appslocal or standalone Expo module
Vendor Android/iOS SDK wrapperExpo Modules API wrapper
Screen itself must be native UIExpo UI custom view or modifier first
Existing host native appexpo-brownfield plus host Turbo Module registration

Inline Module Baseline

{
  "expo": {
    "experiments": {
      "inlineModules": {
        "watchedDirectories": ["app"]
      }
    }
  }
}

After changing this setting, regenerate native projects with npx expo prebuild.

package app

import expo.modules.kotlin.modules.Module
import expo.modules.kotlin.modules.ModuleDefinition

class DevicePolicyModule : Module() {
  override fun definition() = ModuleDefinition {
    Name("DevicePolicy")

    AsyncFunction("isManagedDevice") {
      false
    }
  }
}
internal import ExpoModulesCore

public class DevicePolicyModule: Module {
  public func definition() -> ModuleDefinition {
    Name("DevicePolicy")

    AsyncFunction("isManagedDevice") {
      return false
    }
  }
}

TypeScript Contract

Native modules become an operations risk when the JS side leaks any. Use SDK 56 type generation where possible, or keep a stable wrapper interface.

import { requireNativeModule } from 'expo';

type DevicePolicyModule = {
  isManagedDevice(): Promise<boolean>;
};

export default requireNativeModule<DevicePolicyModule>('DevicePolicy');

Testing Strategy

  • Test public native module APIs through a TypeScript contract test.
  • Use JUnit/Robolectric on Android and XCTest on iOS for permission and error branches.
  • Mock native-unavailable states in the JS wrapper.
  • Use EAS preview builds to verify signing, entitlements, and permission prompts.
  • Mark native runtime changes separately from OTA-only changes in the PR template.

Operating Rules

  • Native capability changes can require a new runtimeVersion and binary release.
  • Do not place secrets or tenant configuration in native source.
  • Promote inline modules into local Expo modules when they are duplicated across apps.
  • If the module may be published, manage semver, changelog, and config plugin migrations together.

Related docs

New Architecture Deep Dive

JSI, Fabric, TurboModules, and production optimization strategy.

Testing Strategy

E2E, native module tests, visual regression, and release gates for Expo SDK 56 apps.

expo-widgets Home Screen Widgets

iOS WidgetKit, Live Activities, and data synchronization patterns with Expo.

Advanced EAS Build Pipelines

Build profiles, cache strategy, EAS environments, and monorepo optimization.

On this page

What Changed in SDK 56Selection GuideInline Module BaselineTypeScript ContractTesting StrategyOperating Rules