NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #3778 most downloaded on npm
The core of Expo Modules architecture
Last release today
17 Sep 2026
Ships on a steady schedule
a new release about every 9 days
Most releases are documented
notes for 49 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
444 releases · first in 2021
One column per quarter.
[Android] Avoid remounting Jetpack Compose views during same-frame React Native reparenting. (#45711 by @mvincentong)
associatedCookies in Network.requestWillBeSentExtraInfo CDP events serializing as a JSON object instead of an array. (#45720 by @huntie)[iOS] Fix encoding Encodable function results so arrays, dictionaries, optionals, RawRepresentable enums and Convertibles route through their dynamic
Deprecated SharedObject.emit(event) (iOS) and the vararg emit (Android) in favor of the new single-payload overloads. Existing single-argument call si…
AppContext.setRuntime now takes the native React RuntimeScheduler pointer and a dispatch trampoline alongside the runtime pointer. (#45636 by @tsapeta)SharedObject.emit(event:arguments:) (iOS) and the vararg emit (Android) in favor of the new single-payload overloads. Existing single-argument call sites keep working unchanged. (#45596 by @tsapeta)[iOS] Fix dictionary/array returns from sync functions invoked in the worklet runtime. (#45419 by @nishan)
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
[android] Fix potential vulnerability in com.canhub.cropper.CropImageActivity being exported. (#45357 by @behenate)
unimodules-app-loader
expo-web-browser
expo-video-thumbnails
expo-task-manager
expo-store-review
expo-speech
expo-sqlite
expo-sms
expo-sharing
expo-secure-store
expo-sensors
expo-screen-capture
expo-screen-orientation
expo-print
expo-network
expo-notifications
expo-localization
expo-media-library
expo-mail-composer
expo-location
expo-keep-awake
expo-modules-core
EXJavaScriptRuntime, EXJavaScriptObject, ExpoModulesHostObject, EXSharedObjectUtils, etc.) with the new ExpoModulesJSI Swift package. Third-party native modules depending on these types must migrate to the new Swift-first API. (#44337 by @tsapeta)expo-local-authentication
expo-linking
expo-image-manipulator
expo-haptics
expo-linear-gradient
expo-gl
expo-image-picker
expo-font
expo-document-picker
expo-file-system
copy() and move() methods of File and Directory are now asynchronous and return a Promise. Use copySync() and moveSync() for synchronous behavior. (#44359 by @barthap)Paths.cache and Paths.document are now pointing to experience-isolated directories. (#45977 by @barthap)File.write() is now asynchronous and returns a Promise. Use File.writeSync() for synchronous behavior. (#45992 by @wh201906)FileHandle.readBytes() and FileHandle.writeBytes() are now asynchronous and return a Promise. Use FileHandle.readBytesSync() and FileHandle.writeBytesSync() for synchronous behavior. (#46280 by @wh201906)expo-device
expo-crypto
expo-contacts
expo-contacts import and move the legacy API to expo-contacts/legacy. (#46037 by @Wenszel)expo-constants
expo-clipboard
expo-cellular
expo-camera
expo-calendar
expo-brightness
expo-blur
expo-battery
expo-background-fetch
expo-application
expo-apple-authentication
expo-asset
@expo/cli 🥳@expo/package-manager 🥳expo 🥳expo-brownfield 🥳expo-json-utils 🥳expo-modules-autolinking 🥳expo-router 🥳expo-module-scripts 🥳expo-modules-jsi 🥳@expo/ui 🥳pod-install 🥳expo-web-browser
expo-task-manager
expo-sqlite
expo-sharing
expo-secure-store
expo-sensors
expo-screen-orientation
expo-notifications
expo-localization
expo-media-library
presentPermissionsPicker (#44432 by @Wenszel)asset.getMediaSubtypes(), asset.getLivePhotoVideoUri(), asset.getIsInCloud(), and asset.getOrientation() (#44568 by @Wenszel)asset.getAlbums() (#44604 by @Wenszel)Album.getAll() (#44446 by @Wenszel)album.removeAssets() (#44455 by @Wenszel)Query.limit(0) returning all assets instead of an empty array (#44245 by @Wenszel)getFavorite()/setFavorite() (#45768 by @Wenszel)expo-mail-composer
expo-location
getMotionActivityAsync, watchMotionActivityAsync, and permission helpers. (#44893 by @Guccio163)expo-modules-core
Equatable conformance to Either type. (#43954 by @nishan) (#43954 by @intergalacticspacehighway) (#43954, #43954 by @intergalacticspacehighway, @intergalacticspacehighway)installModuleClasses and __resolveInWorklet for resolving shared object class prototypes in the worklet runtime. (#44669 by @intergalacticspacehighway)installModuleClasses for building shared object class prototypes in alternate JS runtimes. (#44214 by @nishan) (#44214 by @intergalacticspacehighway)SharedObject.__resolveInWorklet for resolving shared objects in worklet runtimes. (#44215 by @nishan) (#44215 by @intergalacticspacehighway)NativeArrayBuffer and JavaScriptArrayBuffer arguments now also accept typed arrays. (#43082 by @barthap)RuntimeScheduler to schedule tasks on the JS thread. (#43481 by @alanjhughes)nativeModule look up function and bundleURL to AppContext. (#43661 by @gabrieldonadel)Mutex for older platform versions. (#44122 by @tsapeta)@OptimizedComposeProps. (#45021 by @lukmccall)SharedObject.emit dropping NativeArrayBuffer values in events (#45257 by @alanjhughes)SharedObject.emit on iOS and Android. The iOS API also accepts an already-converted JavaScriptValue payload to skip the native-to-JS conversion step. (#45596 by @tsapeta)Decodable types can now be used as native function arguments. JS values are decoded through the dynamic-type registry, so arrays, dictionaries, optionals, RawRepresentable enums and Convertibles are coerced consistently. (#45705 by @tsapeta)expo-local-authentication
expo-linking
Linking.clearInitialURL() to reset the cached deep-link URL. (#46265 by @gabrieldonadel)expo-haptics
expo-linear-gradient
expo-image-picker
launchCameraAsync to be invoked on the simulator. (#45923 by @EvanBacon)expo-font
expo-document-picker
expo-file-system
mode option when opening file handle. (#44559 by @gfemec)expo-document-picker. (#43411 by @HubertBer)overwrite option to copy and move methods. (#42979 by @barthap)mode option when opening file handle. (#42983 by @barthap)onProgress callback and AbortSignal support to File.downloadFileAsync(). (#43053 by @aleqsio)file.createUploadTask() and File.createDownloadTask() APIs (#44055 by @barthap)File.upload() with legacy-compatible upload semantics, progress callbacks, and AbortSignal support. (#45033 by @barthap)File.json() and File.formData() to satisfy Blob type augmentations in consumer projects. (#45685 by @mvincentong)expo-device
expo-contacts
expo-cellular
expo-camera
expo-calendar
calendar.addEventWithForm() (#44966 by @Wenszel)presentPicker() (#44965 by @Wenszel)calendar.addEventWithForm() (#46004 by @Wenszel)expo-brightness
expo-background-fetch
expo-apple-authentication
expo-asset
expo-web-browser
openAuthSessionAsync silently failing on iOS 17.4+ when using https:// redirect URLs without Associated Domains entitlements. The HTTPS universal link callback API is now opt-in via the preferUniversalLinks option. (#44452 by @vonovak)expo-task-manager
HeadlessJsTaskContext. (#43821 by @janicduplessis)proguard-rules.pro via consumerProguardFiles so the -keep class expo.modules.taskManager.** rule is added to consumer apps' R8 pass. (#46029 by @jiunshinn)expo-speech
expo-sqlite
expo-sharing
shareAsync promise leaking when the user picks an activity and then cancels its follow-up dialog (e.g. taps Print, then cancels the print dialog). The completion handler now resolves unconditionally on dismissal. (@Elehiggle) (by @Elehiggle)expo-secure-store
expo-sensors
motionPermission: false — CMAltimeter.stopRelativeAltitudeUpdates() now only runs if updates were started. (#45396 by @JustinFay01)expo-screen-orientation
lockAsync silently failing when flipping between previously-applied masks. (#45239 by @alanjhughes)EXC_BAD_ACCESS crash from recursive supportedInterfaceOrientations when react-native-screens per-screen orientation is set. (#45733 by @rayabelcode)expo-network
isInternetReachable much more robust. Also emit network state changes when network capabilities change. (#45101 by @LumaDevelopment)expo-notifications
requestPermissionsAsync returning raw permission result without several documented fields (#43555 by @vonovak)BackgroundEventTransformer when notification body is a primitive type. (#45198 by @DORI2001)getDevicePushTokenAsync export (#44413 by @vonovak)getRegistrationInfoAsync, relax keychain accessibility to allow access after device unlocked. (#43829 by @jmalmo)BSPreconditionFailure on iOS 16. (#45096 by @qutrek)proguard-rules.pro via consumerProguardFiles so the -keep class expo.modules.notifications.** rule is added to consumer apps' R8 pass. (#45974 by @jiunshinn)expo-localization
expo-media-library
expo-mail-composer
expo-location
locationUnknown errors in watchPositionAsync. (#44027 by @tsapeta)notification_icon drawable before applicationInfo.icon. The launcher icon is full-color and renders as a solid white square in notifications. (#44309 by @creatornader)expo-keep-awake
expo-modules-core
EXJavaScriptSerializable. (#43634 by @tjzel)PersistentFileLog.readEntries race condition by serializing reads on the dispatch queue. (#43958 by @ramonclaudio)EXConstants.bundle from the main bundle to allow running with precompiled XCFrameworks. (#44551 by @chrfalch)ExpoHostWrapper instead of reactBridge.uiManager. (#44375 by @vonovak)react-native-worklets from existing podspec, falling back to peer resolution (#44232 by @kitten)eventEmitter in SwiftUIVirtualView.dispatchEvent to prevent SIGSEGV after view teardown. (#45175 by @DORI2001)Record on Field.options. The set is now guarded by a per-field lock and accessed through a single withOptions API. (#45072 by @nishan) (#45072 by @intergalacticspacehighway)Enumerable function results to JS values. (#45168 by @tsapeta)ExpoModulesJSI (#45124 by @chrfalch)rgb(...) and rgba(...) color strings when converting JS color values to android.graphics.Color. (#44023 by @dileepapeiris)Host component for SwiftUI or Jetpack Compose components. (#44118 by @kudo)Record conversion behavior by hydrating only declared fields, preserving undefined handling for object properties, and emitting typed records directly to JS. (#45085 by @barthap)libworklets.so via prefab before falling back to local CMake output. (#43863 by @Insik-Han)Encodable function results so arrays, dictionaries, optionals, RawRepresentable enums and Convertibles route through their dynamic types instead of producing wrong shapes. (#45575 by @tsapeta)associatedCookies in Network.requestWillBeSentExtraInfo CDP events serializing as a JSON object instead of an array. (#45720 by @huntie)ExpoComposeView content visible during parent view transitions (e.g., react-native-screens pop navigation). (#45942 by @intergalacticspacehighway)SharedObject.emit crashes caused by an off-thread JSI lookup. (#45986 by @tsapeta)-Wunused-result compiler warning in FrontendConverter.cpp. (#46073 by @tomekzaw)Host double-composing children. (#46304 by @nishan) (#46304 by @intergalacticspacehighway)UISupportedInterfaceOrientations~ipad. (#46281 by @bryandent) (#46306 by @mvincentong) (#46306 by @bryandent, @mvincentong)expo-local-authentication
expo-intent-launcher
getApplicationIcon throwing an error on Android below API 26. (#46043 by @lukmccall)expo-image-manipulator
expo-gl
msaaSamples and enableExperimentalWorkletSupport optional in GLViewProps to align TypeScript types with their runtime defaultProps values. (#43767 by @jcarlosroldan)WebGLRenderingContext and WebGL2RenderingContext globals and their numeric constants at module init so libraries that read them before any GL context is created no longer crash. (#45865 by @tsapeta)WebGL2RenderingContext inherit from WebGLRenderingContext, matching the WebGL spec. gl2 instanceof WebGLRenderingContext now returns true for WebGL2 contexts, and shared constants and methods are no longer duplicated on the WebGL2 prototype. (#45871 by @tsapeta)expo-image-picker
null mime type reported (#43734 by @vonovak)com.canhub.cropper.CropImageActivity being exported. (#45357 by @behenate)base64 result not being a JPEG data. (#43806 by @barthap)expo-font
expo-document-picker
expo-file-system
md5 hash. (#44064 by @barthap)totalDiskSpace returning free disk space instead of total disk capacity. (#44849 by @shanebdavis)onProgress callback of File.downloadFileAsync() sometimes not firing on download completion. (#45238 by @barthap)File.pickFileAsync() greying out all files when using wildcard MIME types like */* or image/*. (#45245 by @barthap)FileSystemFileHandle to honor FileMode string values ('r', 'w', 'wa', 'wt', 'rw') instead of the obsolete name table, expose handle and file metadata, and match the documented default mode for content:// URIs. The dispatch is now exhaustive over FileMode, so future enum additions fail to compile in the mock. (by @radko93)delete() and openHandle() in the next-gen File System API. (#45967 by @barthap)createFile, createDirectory, and rename that allowed escaping the parent directory. (#45967 by @barthap)Paths.cache and Paths.document pointing to wrong directory in Expo Go. (#45977 by @barthap)expo-crypto
crypto on globalThis rather than just window.crypto (#43405 by @bradleyayers)expo-contacts
expo-cellular
expo-camera
isAvailableAsync returning true on devices without a camera. (#43932 by @alanjhughes)type value returned by ZXing fallback scanner (code39, pdf417, codabar) — it now returns the same format as the AVFoundation scanner (e.g. "code39" instead of "org.iso.Code39"). (#44726 by @jensdev)CameraView.launchScanner is interactively dismissed and the app is backgrounded/foregrounded. (#45063 by @alanjhughes)RECORD_AUDIO from the manifest so recordAudioAndroid depends on the plugin. (#45132 by @alanjhughes)itf14 barcode type not detecting generic Interleaved 2 of 5 barcodes, so behavior matches Android's FORMAT_ITF. (#44796 by @mduchev)expo-calendar
NumberFormatException crash on Android when calendar/event IDs exceed Integer.MAX_VALUE. (#43344 by @olivier-bouillet)deleteEventAsync deleting wrong recurring event instance when instanceStartDate is provided. (#40172 by @marcelogdeandrade)calendarIds filter input (#45951 by @kitten)expo-brightness
expo-blur
BlurTargetView that could trigger view already removed from parent errors during root tree transitions. (#43595 by @stathis) (#43595 by @efstathiosntonas) (#43595, #43595 by @efstathiosntonas, @efstathiosntonas)blurReductionFactor into account. (#43814 by @behenate)expo-battery
expo-background-fetch
expo-application
PromiseAlreadySettledException crash in getInstallReferrerAsync when onInstallReferrerServiceDisconnected gets called after promise settlement. (#43419 by @nishan) (#43419 by @intergalacticspacehighway) (#43419, #43419 by @intergalacticspacehighway, @intergalacticspacehighway)expo-apple-authentication
expo-asset
unimodules-app-loader
expo-web-browser
experimentalLauncherActivity config plugin option. (#44073 by @lukmccall)expo-store-review
expo-sqlite
runSync, applyChangesetSync, invertChangesetSync) to accept any AnyArrayBuffer in place of the removed JavaScriptArrayBuffer. (#44337 by @tsapeta)ArrayBuffers. (#42638 by @barthap)ArrayBuffers for blob columns. (#42639 by @barthap)ArrayBuffers. (#42640 by @barthap)ArrayBuffers. (#42642 by @barthap)expo-sensors
expo-screen-capture
expo-screen-orientation
expo-notifications
import React for xcframework compatibility. (#44248 by @chrfalch)expo instead of expo-modules-core (#45565 by @Wenszel)expo-localization
expo-media-library
expo-location
expo-modules-core
EXAppContextProtocol, EXReactDelegateProtocol, EXAppContextFactoryRegistry) for cross-xcframework module boundaries. Refactored legacy module registry, Fabric view headers, JSI layer, and podspecs for xcframework compatibility. (#44248 by @chrfalch)ViewWrapper protocol and AnyContentViewProvider for type-erased access to wrapped SwiftUI views. (#43669 by @nishan) (#43669 by @intergalacticspacehighway) (#43669, #43669 by @intergalacticspacehighway, @intergalacticspacehighway)SwiftUIVirtualViewSharedImpl+Private.h leaking into the public module umbrella. (#44993 by @chrfalch)ExpoModulesCore.podspec to propagate to swift-only targets like Expo Widgets (#44984 by @chrfalch)AppContext, and worklets integration on top of the new ExpoModulesJSI package. (#44337 by @tsapeta)EXJavaScriptRuntime, EXJavaScriptObject, ExpoModulesHostObject, EXSharedObjectUtils, etc.) with the new ExpoModulesJSI Swift package. Third-party native modules depending on these types must migrate to the new Swift-first API. (#44337 by @tsapeta)installModuleClasses and __resolveInWorklet for resolving shared object class prototypes in the worklet runtime. (#44669 by @intergalacticspacehighway)installModuleClasses for building shared object class prototypes in alternate JS runtimes. (#44214 by @nishan)SharedObject.__resolveInWorklet for resolving shared objects in worklet runtimes. (#44215 by @nishan)NativeArrayBuffer and JavaScriptArrayBuffer arguments now also accept typed arrays. (#43082 by @barthap)RuntimeScheduler to schedule tasks on the JS thread. (#43481 by @alanjhughes)nativeModule look up function and bundleURL to AppContext. (#43661 by @gabrieldonadel)Mutex for older platform versions. (#44122 by @tsapeta)@OptimizedComposeProps. (#45021 by @lukmccall)SharedObject.emit dropping NativeArrayBuffer values in events (#45257 by @alanjhughes)Record on Field.options. The set is now guarded by a per-field lock and accessed through a single withOptions API. (#45072 by @nishan)Enumerable function results to JS values. (#45168 by @tsapeta)ExpoModulesJSI (#45124 by @chrfalch)rgb(...) and rgba(...) color strings when converting JS color values to android.graphics.Color. (#44023 by @dileepapeiris)Host component for SwiftUI or Jetpack Compose components. (#44118 by @kudo)Record conversion behavior by hydrating only declared fields, preserving undefined handling for object properties, and emitting typed records directly to JS. (#45085 by @barthap)libworklets.so via prefab before falling back to local CMake output. (#43863 by @Insik-Han)SwiftUIVirtualViewSharedImpl+Private.h leaking into the public module umbrella. (#44993 by @chrfalch)ExpoModulesCore.podspec to propagate to swift-only targets like Expo Widgets (#44984 by @chrfalch)AppContext, and worklets integration on top of the new ExpoModulesJSI package. (#44337 by @tsapeta)@OptimizedFunction macros support for Expo modules. (#44262 by @kudo)EXNativeModulesProxy (#42672 by @tsapeta)ExpoBridgeModule (#44351 by @tsapeta)ComposableScope and allow extensibility. (#44698 by @kudo)ExpoUIView DSL. (#44081 by @kudo)ExpoModulesMacros precompiling. (#44863 by @kudo)PersistentFileLog. (#45058 by @lukmccall)EnumTypeConverter. (#45204 by @lukmccall)ExpoModulesWorklets precompilable via runtime provider injection. (#45026 by @chrfalch)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
[iOS] Guard against null eventEmitter in SwiftUIVirtualView.dispatchEvent to prevent SIGSEGV after view teardown. (#45175 by @DORI2001)
[iOS] Fix finding EXConstants.bundle inside framework bundle for brownfield (#44810 by @gabrieldonadel)
[iOS] Resolve react-native-worklets from existing podspec, falling back to peer resolution (#44232 by @kitten)
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
[iOS] Fixed looking up the EXConstants.bundle from the main bundle to allow running with precompiled XCFrameworks. (#44551 by @chrfalch)
EXConstants.bundle from the main bundle to allow running with precompiled XCFrameworks. (#44551 by @chrfalch)ExpoHostWrapper instead of reactBridge.uiManager. (#44375 by @vonovak)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
[iOS] Fixed adding SwiftUI views to tabs BottomAccessory. (#44247 by @t0maboro)
PersistentFileLog.readEntries race condition by serializing reads on the dispatch queue. (#43958 by @ramonclaudio)_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
[iOS] Added Equatable conformance to Either type. (#43954 by @nishan) (#43954 by @intergalacticspacehighway)
Equatable conformance to Either type. (#43954 by @nishan) (#43954 by @intergalacticspacehighway)EXJavaScriptSerializable. (#43634 by @tjzel)EXAppContextProtocol, EXReactDelegateProtocol, EXAppContextFactoryRegistry) for cross-xcframework module boundaries. Refactored legacy module registry, Fabric view headers, JSI layer, and podspecs for xcframework compatibility. (#44248 by @chrfalch)ViewWrapper protocol and AnyContentViewProvider for type-erased access to wrapped SwiftUI views. (#43669 by @nishan) (#43669 by @intergalacticspacehighway)Nothing published for this version
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
[Android] Fixed Compose view clipping that caused Material ripple effects to be cut off (e.g., Switch thumb ripple). (#43656 by @vonovak)
Nothing published for this version
Nothing published for this version
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
[iOS] Fixed field.options.insert() silently failing in fieldsOf() due to mutation on protocol existential. (#43341 by @just1and0)
field.options.insert() silently failing in fieldsOf() due to mutation on protocol existential. (#43341 by @just1and0)Prop definition component by isolating its setter to the main actor. (#43348 by @tsapeta)[iOS] Fix crash from PersistentFileLog. (#43283 by @alanjhughes)
PersistentFileLog. (#43283 by @alanjhughes)Either type stable. (#43267 by @lukmccall)[iOS] Added DynamicBoolType to correctly distinguish boolean values from numeric 0/1. (#42978 by @nishan)
DynamicBoolType to correctly distinguish boolean values from numeric 0/1. (#42978 by @nishan)DynamicBoolType to throw NullCastException for nil values, matching DynamicRawType behavior. (#43085 by @nishan)NativeModulesProxy is absent. (#43020 by @tsapeta)[iOS] Fixed missing dependencies when building from source (#42901 by @chrfalch)
Fix global type declaration chain to point to expo -> expo-modules-core/types -> ./build/global rather than types="node" (#42751 by @kitten)
[iOS] Renamed ignoreSafeAreaKeyboardInsets to ignoreSafeArea on Host component. It now accepts 'all' or 'keyboard' instead of a boolean. (#42598 by @n
ignoreSafeAreaKeyboardInsets to ignoreSafeArea on Host component. It now accepts 'all' or 'keyboard' instead of a boolean. (#42598 by @nishan)_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
[Android] Added missing checks in the promise implementation. (#42467 by @lukmccall)
[Android] Fixed crashes in JavaScriptValue/JavaScriptObject destructor caused by freeing memory after the runtime is destroyed. (#42440 by @lukmccall)
[macos] Remove react-native-macos@0.79.0 workarounds (#42409 by @gabrieldonadel)
_This version does not introduce any user-facing changes._
This version does not introduce any user-facing changes.
Your coding agent can read these notes before it upgrades. Set up the MCP server →