expo-modules-core
58.0.23 · 19 Oct 2026MIT7.1M / weekRepositoryHomepagenpmAtom feed
297 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
- 58.x · latest line
58.0.23
19 Oct 2026[iOS] Reduce the overhead of returning
Dataand shared objects to JavaScript.[Android] Fix a Jetpack Compose
Hostthat stays blank when it mounts in a visible list row withremoveClippedSubviewsenabled, for example in aFlatList. TheHostnow measures its content when it is attached for the first time.[iOS] Update
expo-modules-macrosto 0.21.0.@Recordtypes now convert between JavaScript and native code with less overhead and no longer need an app context.@ExpoModuleand@SharedObjectnow report a build error when two@JSmembers of one object have the same JavaScript name, because JavaScript could reach only one of them.
Patch Changes
[iOS] Reduce the overhead of returning
Dataand shared objects to JavaScript.[Android] Fix a Jetpack Compose
Hostthat stays blank when it mounts in a visible list row withremoveClippedSubviewsenabled, for example in aFlatList. TheHostnow measures its content when it is attached for the first time.[iOS] Update
expo-modules-macrosto 0.21.0.@Recordtypes now convert between JavaScript and native code with less overhead and no longer need an app context.@ExpoModuleand@SharedObjectnow report a build error when two@JSmembers of one object have the same JavaScript name, because JavaScript could reach only one of them.Shared objects now report their class name from
Object.prototype.toString, for example[object VideoPlayer]. React in development builds no longer deep-compares shared objects in props, which threwERR_NATIVE_SHARED_OBJECT_NOT_FOUNDwhen the previous props held a released shared object.Blobfromexpo-blobandFilefromexpo-file-systemnow report[object Blob]and[object File], as on the web. Libraries that detect these types by this tag now treat them as aBloband aFile.
58.0.22
16 Oct 2026[Android] Fix native memory that grew with each module class under Hermes V1, by about 0.57 MiB per class on React Native 0.86 and 0.87 and about 93 KiB on 0.88.
createClassevaluated a new JavaScript source for each class, and Hermes keeps memory for every evaluated source until the runtime is destroyed. It now evaluates one class factory for each runtime and calls it for each class. On iOS, this code creates only the four base classes (SharedObject,SharedRef,EventEmitterandNativeModule).Fix an
-Wunused-resultwarning inWorklet.cppon Android when building withreact-native-worklets@0.13. Running a worklet synchronously now discards its return value while the worklet runtime lock is still held, on Android and iOS.Fix the
Do not include this file directlywarnings fromreact-native-worklets@0.13on Android and iOS. The worklets integration now includes the specificSerializableheaders instead of the deprecatedworklets/SharedItems/Serializable.h.
Patch Changes
[Android] Fix native memory that grew with each module class under Hermes V1, by about 0.57 MiB per class on React Native 0.86 and 0.87 and about 93 KiB on 0.88.
createClassevaluated a new JavaScript source for each class, and Hermes keeps memory for every evaluated source until the runtime is destroyed. It now evaluates one class factory for each runtime and calls it for each class. On iOS, this code creates only the four base classes (SharedObject,SharedRef,EventEmitterandNativeModule).Fix an
-Wunused-resultwarning inWorklet.cppon Android when building withreact-native-worklets@0.13. Running a worklet synchronously now discards its return value while the worklet runtime lock is still held, on Android and iOS.Fix the
Do not include this file directlywarnings fromreact-native-worklets@0.13on Android and iOS. The worklets integration now includes the specificSerializableheaders instead of the deprecatedworklets/SharedItems/Serializable.h.
58.0.21
16 Oct 2026[Web] Fix
globalThis.expomissing on web when Rolldown orvite buildon Vite 8 dropsensureNativeModulesAreInstalledand the polyfill it imports. The module is now listed insideEffects.
58.0.20
16 Oct 2026Change the optional
react-native-workletspeer dependency to0.13.0, the version bundled with SDK 58.npm installno longer fails withERESOLVEwhen the bundledreact-native-workletsversion is installed. Earlierreact-native-workletsversions do not support React Native 0.88.
58.0.19
15 Oct 2026[iOS] Speed up module registration at app launch by classifying definition elements without protocol conformance lookups.
[iOS] Reduced the overhead of emitting events without a payload.
[iOS] Speed up app launch by computing default module, class and view names without protocol conformance lookups.
Patch Changes
[iOS] Speed up module registration at app launch by classifying definition elements without protocol conformance lookups.
[iOS] Reduced the overhead of emitting events without a payload.
[iOS] Speed up app launch by computing default module, class and view names without protocol conformance lookups.
[iOS] Publish a headers XCFramework for
ExpoModulesCorewith the package, atprebuilds/output/headers/xcframeworks/ExpoModulesCoreHeaders.tar.gz.[iOS] Add
isFunction(),isTypedArray(),isArrayBuffer(),getTypedArray(in:),getArrayBuffer(in:),getBigInt(in:)andkindtoJavaScriptUnownedValue.Data, typed arrays,ArrayBufferand integers from aBigIntnow decode function arguments without copying them into an owningJavaScriptValue: aDataargument is about 10% faster to decode, and anInt64from aBigIntabout 8× faster.[Internal] Drop unused
EXPO_PROJECT_ROOTandEXPO_ROUTER_ABS_APP_ROOTvariables and corresponding invalidation.
58.0.18
14 Oct 2026[iOS] Fix slow cold launches in brownfield apps where the
ExpoModulesProviderlookup scannedBundle.allFrameworksinside+load. The lookup now tries the framework that contains ExpoModulesCore before falling back to the scan.[iOS] Update
expo-modules-macrosto 0.20.0, which binds@JSfunctions and setters that return nothing through theVoidoverload, so they no longer build anundefinedvalue on each call.[iOS] Reduced the overhead of emitting module events.
Patch Changes
[iOS] Fix slow cold launches in brownfield apps where the
ExpoModulesProviderlookup scannedBundle.allFrameworksinside+load. The lookup now tries the framework that contains ExpoModulesCore before falling back to the scan.[iOS] Update
expo-modules-macrosto 0.20.0, which binds@JSfunctions and setters that return nothing through theVoidoverload, so they no longer build anundefinedvalue on each call.[iOS] Reduced the overhead of emitting module events.
58.0.17
13 Oct 2026[iOS] Fix a launch crash (
Symbol not found: _swift_allocateMetadataPack) in apps that use precompiled Expo modules and build with Xcode 27.ExpoModulesJSIno longer exports Swift runtime symbols, so the precompiledExpoModulesCoreno longer depends on them.[iOS] Fix a
UIViewControllerHierarchyInconsistencycrash when a SwiftUI view (such as@expo/ui'sHost) is rendered inside a text input's accessory view, for example React Native'sInputAccessoryViewor react-native-keyboard-controller'sKeyboardExtender.
Patch Changes
[iOS] Fix a launch crash (
Symbol not found: _swift_allocateMetadataPack) in apps that use precompiled Expo modules and build with Xcode 27.ExpoModulesJSIno longer exports Swift runtime symbols, so the precompiledExpoModulesCoreno longer depends on them.[iOS] Fix a
UIViewControllerHierarchyInconsistencycrash when a SwiftUI view (such as@expo/ui'sHost) is rendered inside a text input's accessory view, for example React Native'sInputAccessoryViewor react-native-keyboard-controller'sKeyboardExtender.
58.0.16
13 Oct 2026- breaking
[iOS] Make
JavaScriptValuea non-copyable struct. This is a breaking change for Swift code that usesJavaScriptValuedirectly: [Internal] Bump precompiled artifacts due to ABI breakage in expo-modules-jsi, which makes
JavaScriptValuea non-copyable struct.[iOS] Update
expo-modules-macrosto 0.16.0, which supports closure arguments in@JSfunctions and initializers.
Patch Changes
[Internal] Bump precompiled artifacts due to ABI breakage in expo-modules-jsi, which makes
JavaScriptValuea non-copyable struct.[iOS] Update
expo-modules-macrosto 0.16.0, which supports closure arguments in@JSfunctions and initializers.[iOS] [Internal] Hold cached JavaScript values and the encoder and decoder state behind
JavaScriptRef.[Android] Fix build errors with React Native nightlies by removing an unneeded
enableCppPropsIteratorSettercheck from Expo views.- breaking
[iOS] Make
JavaScriptValuea non-copyable struct. This is a breaking change for Swift code that usesJavaScriptValuedirectly:Values are moved, not shared. Pass them as
borrowingorconsumingparameters, and callcopy()where a second owned value is needed.JavaScriptValue.undefinedandJavaScriptValue.nullare functions now: write.undefined()and.null().A
JavaScriptValuecan no longer be an argument or a result of aFunction,AsyncFunction,PropertyorFielddefinition. Declare the function with the@JSmacro instead (in an@ExpoModuleor@SharedObjectclass) and take the value asborrowing JavaScriptValue, or use a typed argument.To keep a value in an array, an escaping closure or another place that takes copyable types only, wrap it with
value.ref()and read it back withtake()orwithUnwrappedValue(_:).JavaScriptArray.init(_:items:),JavaScriptArray.enumerated(),JavaScriptArray.filter(_:)andJavaScriptValuesBuffer.copying(in:values:)with an array of values are removed. Use the parameter pack initializer,forEach,forEachIndexed,reduce, or the[JavaScriptValue.Ref]overload.
[iOS] [Internal] Remove
copy runtimewhere a borrowedJavaScriptRuntimeis passed to a function, which already borrows its parameters.[iOS] Read the properties of a typed array through property names cached per runtime, which makes
JavaScriptValue.getTypedArray()about twice as fast.getTypedArray()is now isolated toJavaScriptActor, likeasTypedArray().
58.0.15
9 Oct 2026[Android] Fix record arguments without
@OptimizedRecord(such asImagePickerOptionsin olderexpo-image-pickerversions) failing to convert in minified release builds withThe 1st argument cannot be cast to type ...caused by aNullPointerException. Keep the@Fieldannotation class from being renamed by R8.[Android] Fix release builds crashing at launch when the app uses an Expo Modules API 2.0 module, such as
expo-crypto. R8 removed classes and members that the v2 runtime reaches through reflection and JNI.[Android] Fixed Expo modules not receiving
OnCreatewhen JavaScript reaches the JSINativeModulesProxybefore the legacy one, for example with lazy imports, which made modules likeexpo-web-browserfail on first use. Its constants are read lazily again, as before #46964.
Patch Changes
[Android] Fix record arguments without
@OptimizedRecord(such asImagePickerOptionsin olderexpo-image-pickerversions) failing to convert in minified release builds withThe 1st argument cannot be cast to type ...caused by aNullPointerException. Keep the@Fieldannotation class from being renamed by R8.[Android] Fix release builds crashing at launch when the app uses an Expo Modules API 2.0 module, such as
expo-crypto. R8 removed classes and members that the v2 runtime reaches through reflection and JNI.[Android] Fixed Expo modules not receiving
OnCreatewhen JavaScript reaches the JSINativeModulesProxybefore the legacy one, for example with lazy imports, which made modules likeexpo-web-browserfail on first use. Its constants are read lazily again, as before #46964.[iOS] Fixed JavaScript errors created from native
Exceptions using the exception's debug description as theirmessage, which prefixed it with the Swift type name and appended the nativefile:line(e.g.MyException: reason (at MyModule.swift:42)). The message is the exception'sdescriptionagain, as before the JSI rewrite and as on Android.Exception.messagecan now be overridden by subclasses; subclasses that already declare amessageproperty need to mark it asoverride.[Android] Fix views sized by Jetpack Compose, such as
RNHostViewin aModalBottomSheet, that kept their old size until the keyboard animation ended when the keyboard was dismissed with the predictive back gesture.[iOS] Throw when JavaScript constructs a shared object class that has no way to build its native instance, instead of returning an object that fails at its first member access.
[Android] Warn instead of failing silently when
installModules()gives up waiting for an activeReactInstance. Previously JSI interop was installed into a context with no active instance and the method still returnedtrue, so the first visible symptom wasglobalThis.expobeing undefined in JS.
58.0.14
6 Oct 2026[Android] Fixed a data race on the Fabric view state-prop map when Expo registers its view components while React Native builds a component descriptor registry on another thread.
[Internal] Import
LogBox,DevSettings, andNativeComponentRegistryfrom thereact-nativepublic API.
58.0.13
5 Oct 2026[macOS] Attach SwiftUI hosting views even when no
NSViewControlleris in the responder chain, such as a React root view set directly asNSWindow.contentView. Previously,@expo/uicontent in such windows rendered nothing.[iOS] Update
expo-modules-macrosto 0.15.0, which generates only the unowned decode for@Unionand skips cases whosedecodableKindscan't match.[Internal] Make
AppContextnon-final, so thatTestAppContextfromexpo-modules-test-corecan subclass it.
Patch Changes
[macOS] Attach SwiftUI hosting views even when no
NSViewControlleris in the responder chain, such as a React root view set directly asNSWindow.contentView. Previously,@expo/uicontent in such windows rendered nothing.[iOS] Update
expo-modules-macrosto 0.15.0, which generates only the unowned decode for@Unionand skips cases whosedecodableKindscan't match.[Internal] Make
AppContextnon-final, so thatTestAppContextfromexpo-modules-test-corecan subclass it.[Android] Fixed a race where a promise resolved and rejected from different threads at the same time could settle twice and throw on the JavaScript thread.
[Android] An Expo Modules API 2.0 module that throws a
CodedExceptionnow reports itscodeto JavaScript.
58.0.12
3 Oct 2026[Internal][Android]
expoPublishnow formats the updatedexpo-module.config.jsonwithoxfmtinstead ofprettier.[iOS] Add
decodableKindstoJavaScriptDecodable: the kinds of JavaScript value (JavaScriptValueKinds) thatdecodecan accept, so code that picks between several types can skip the ones that can't match.[iOS] Add
JavaScriptValue.withUnownedValue(in:_:), and give the owningJavaScriptDecodable.decodea default that borrows the value and decodes it through theJavaScriptUnownedValueoverload, so a conformer can implement only that one. Arrays, dictionaries, dates, records and enums now decode unowned values without copying them first.
Patch Changes
[Internal][Android]
expoPublishnow formats the updatedexpo-module.config.jsonwithoxfmtinstead ofprettier.[iOS] Add
decodableKindstoJavaScriptDecodable: the kinds of JavaScript value (JavaScriptValueKinds) thatdecodecan accept, so code that picks between several types can skip the ones that can't match.[iOS] Add
JavaScriptValue.withUnownedValue(in:_:), and give the owningJavaScriptDecodable.decodea default that borrows the value and decodes it through theJavaScriptUnownedValueoverload, so a conformer can implement only that one. Arrays, dictionaries, dates, records and enums now decode unowned values without copying them first.Fixed native views ignoring
aria-*,idandtabIndexprops such asaria-hiddenandaria-label(#50782).Fixed
release()throwing on a shared object whose JS object is frozen, for example anImageRefpassed as a view prop in development (#50962).
58.0.11
1 Oct 2026[iOS]
@Recordnow accepts properties that hold free-formAnyvalues, such as[String: Any]?or[Any].[Android] Fixed Expo views using Android layout not completing system-forced layout passes.
Patch Changes
Bump precompiled artifacts due to ABI breakage in expo-modules-jsi@58.0.6.
[iOS]
@Recordnow accepts properties that hold free-formAnyvalues, such as[String: Any]?or[Any].[Android] Fixed Expo views using Android layout not completing system-forced layout passes.
58.0.10
1 Oct 2026Lay out
RNHostViewhosted content at the size SwiftUI or Compose gives it on an axis thatmatchContentsdoes not match.
Patch Changes
Lay out
RNHostViewhosted content at the size SwiftUI or Compose gives it on an axis thatmatchContentsdoes not match.
58.0.9
29 Sep 2026Force-bump all packages, due to migration to changesets.
[iOS] Depend on
expo-modules-macros, the new name of the@expo/expo-modules-macros-pluginpackage.[iOS] Fixed a crash (
The app context has been lost) when an Expo view mounts during a reload.
Patch Changes
Force-bump all packages, due to migration to changesets.
[iOS] Depend on
expo-modules-macros, the new name of the@expo/expo-modules-macros-pluginpackage.[iOS] Fixed a crash (
The app context has been lost) when an Expo view mounts during a reload.
58.0.8
28 Sep 2026[Android] Throw a JavaScript error instead of aborting when returning a shared object whose JavaScript instance is no longer available.
58.0.7
25 Sep 2026Fixed listeners removed with
subscription.remove()never being garbage-collected, together with their emitter and everything their closure references, when the closure can reach the subscription (as inuseEvent,useEventListeneror auseEffectthat returns() => subscription.remove()).[iOS] Fixed
Exceptionreportingundefined reasonto JavaScript instead of the description it was created with, which also affected everypromise.reject(code, description)call.
58.0.6
23 Sep 2026Added
Platform.isQuestto detect Meta Quest devices from JavaScript.Preserve shared objects when React Activity becomes hidden, handle Strict Mode replay, and wait for all pending updates before releasing objects.
[Android] Fixed async functions rejecting with
Cannot use shared object that was already released, andsharedObjectDidReleasebeing called in the middle of a pending call, when the garbage collector took the JS object of a shared object receiver or argument before the call finished.
New features
Added
Platform.isQuestto detect Meta Quest devices from JavaScript.
Bug fixes
Preserve shared objects when React Activity becomes hidden, handle Strict Mode replay, and wait for all pending updates before releasing objects.
[Android] Fixed async functions rejecting with
Cannot use shared object that was already released, andsharedObjectDidReleasebeing called in the middle of a pending call, when the garbage collector took the JS object of a shared object receiver or argument before the call finished.[iOS] Fixed
nilrecord fields being omitted instead of returned asnullwhen a function's return type is an optional record.
58.0.5
22 Sep 2026[iOS] Added
SceneGeometry.anchorPopover(of:to:rect:)so modules anchor popovers by presentation style instead of the iPad idiom, which regular-width phones such as iPhone Duo need.Fixed a crash while laying out an
RNHostViewwithmatchContentswhose content is laid out more than once, for example a nested host or a Reanimated node. The hosted shadow node could be released beforereplaceChildfinished reading it.
58.0.4
21 Sep 2026[iOS] Added
EmbeddedFingerprint, which reads the fingerprint a debug build embedded, withEmbeddedFingerprint.CheckProtocolcarrying the literals of the fingerprint-check exchange.[Android] Fixed worklet callbacks crashing with
NoSuchFieldErrorin minified release builds.[Android] Replaced the hosting
ComposeView's view id with a tag for itsrememberSaveablenamespace, fixing a crash onreact-native-screenstab switch and touches inside aHostreaching the wrong React Native view.
New features
[iOS] Added
EmbeddedFingerprint, which reads the fingerprint a debug build embedded, withEmbeddedFingerprint.CheckProtocolcarrying the literals of the fingerprint-check exchange.
Bug fixes
[Android] Fixed worklet callbacks crashing with
NoSuchFieldErrorin minified release builds.[Android] Replaced the hosting
ComposeView's view id with a tag for itsrememberSaveablenamespace, fixing a crash onreact-native-screenstab switch and touches inside aHostreaching the wrong React Native view.[macOS] Fixed a crash when mounting a SwiftUI view in a release build. react-native-macos assigns component view tags through
reactTag, which the virtual view did not declare.[Android] Fixed strings losing NUL characters when crossing JNI in either direction, and characters outside the BMP being misread on the way to Kotlin.
[iOS] Fixed the tap that closes a SwiftUI menu still reaching the React Native view underneath it in apps with no accessibility client attached. The menu gate no longer requires
accessibilityViewIsModal, which UIKit only implements for the menu container while its accessibility bundle is loaded.
Others
[iOS] Bumped
@expo/expo-modules-macros-pluginto0.12.0.[Android] Use the prebuilt native libraries in every build, including the package's own instrumentation tests, drop the
libraryVersioncheck so the archive stays valid across patch releases, and add theexpo.core.buildFromSourceGradle property to opt out.
58.0.3
16 Sep 2026This version does not introduce any user-facing changes.
58.0.2
15 Sep 2026- breaking
[Android] Compile
expo-module-gradle-pluginagainst Android Gradle Plugin 9.2.1 and drop the Android Gradle Plugin 8 compatibility code. [Android] Fixed native-backed
ArrayBuffers andNativeArrayBuffers being copied instead of shared when passed back from JS on Hermes V1.
58.0.1
14 Sep 2026[iOS] Added the
@Unionmacro that turns an enum whose cases each carry one associated value into a typed union (A | Bin TypeScript), usable as a@JSargument or return value.[iOS] Added the
.concurrentoption to@JS(@JS(.concurrent)), which runs the body of an async function off the JavaScript thread.[iOS] Bumped
@expo/expo-modules-macros-pluginto0.10.0.
New features
[iOS] Added the
@Unionmacro that turns an enum whose cases each carry one associated value into a typed union (A | Bin TypeScript), usable as a@JSargument or return value.[iOS] Added the
.concurrentoption to@JS(@JS(.concurrent)), which runs the body of an async function off the JavaScript thread.
Others
[iOS] Bumped
@expo/expo-modules-macros-pluginto0.10.0.[iOS] Made
Either,EitherOfThreeandEitherOfFourconform toJavaScriptDecodableandJavaScriptEncodable, so they can be used with the new module API.
58.0.0
10 Sep 2026- breaking
[Android] Removed the deprecated
AppContext.hostingRuntimeContextproperty. UseAppContext.runtimeinstead. - breaking
[Android] Removed the deprecated
AppContext.errorManagerproperty. UseAppContext.jsLoggerinstead. - breaking
[Android] Replaced the old
ArrayBufferinterface with a concrete class, soNativeArrayBufferandJavaScriptArrayBufferno longer share a commonArrayBuffersupertype.
Breaking changes
- breaking
[Android] Removed the deprecated
AppContext.hostingRuntimeContextproperty. UseAppContext.runtimeinstead. - breaking
[Android] Removed the deprecated
AppContext.errorManagerproperty. UseAppContext.jsLoggerinstead. - breaking
[Android] Replaced the old
ArrayBufferinterface with a concrete class, soNativeArrayBufferandJavaScriptArrayBufferno longer share a commonArrayBuffersupertype. - breaking
[Android] Introduce
ConverterContext. - breaking
[iOS] Removed
EXUtilities.screenScale, which cached the main screen's scale for the process lifetime. Read the scale from the view's trait collection instead.
New features
[macOS] Added
UIColor,UIGestureRecognizerandUITextContentTypeto the AppKit compatibility aliases inPlatform.swift.Added
ExpoSwiftUI.HostingViewAware, an opt-in protocol for view props that receive the view hosting their SwiftUI view, so a view can resolve its own window instead of a process-global one.[Android] Added a
loadImageForManipulationFromURLoverload toImageLoaderInterfacethat decodes the image within the givenmaxWidth/maxHeightbounds.Add
useReleasingSharedObjectWithLifecyclehook.- deprecated
Added
ArrayBufferas the preferred safe native module argument and return type, and deprecatedNativeArrayBufferin favor of it. [iOS] Added module lifecycle hooks that replace the
OnCreate,OnDestroy,OnStartObservingandOnStopObservingDSL components:didCreate,willDestroy,didStartListeninganddidStopListening.[Android] Support
PlatformColoras Color.[Android] Added
ArrayBuffer.withJSBytesfor safe scoped access to underlying bytes from any thread.Added
getNativeRef()to views created withrequireNativeViewManager, which returns the underlying host component.
Bug fixes
[iOS] Fixed SwiftUI view mounting blocking the main thread:
ViewPropsandShadowNodeProxynow store theirobjectWillChangepublisher instead of resolving it through Combine's global observable-object table on every access.[iOS] Fixed the tap that closes a SwiftUI menu still sending
touchStart,onPressInandonPressOutto the React Native view underneath it. React Native's touch handler is now told to skip that tap before UIKit delivers it, instead of being cancelled afterwards.[Web] Type
registerWebModuleas returning an instance of the module class rather than the class itself, matching what it returns at runtime.[Android] Fix Expo module views not receiving props with React Native 0.87.
[Android] Fixed
BadParcelableExceptionat startup when an activity-result launch was interrupted.DataPersistorread the persistedBundlewith noClassLoader, so the bootClassLoadercould not resolveandroidx.activity.result.ActivityResult.[iOS][Android] Fixed a
matchContentsRNHostViewand thematchContentshost around it feeding each other's size back and forth, which grew the layout on every pass.[iOS] Fixed SwiftUI view props re-decoding every field on every props update. Fabric sends the whole props map rather than a delta, so an unrelated prop change replaced each decoded value with an equal but distinct one, which cost a decode per field and stopped SwiftUI from pruning the view tree that reads it. A field whose raw value is unchanged now keeps the value decoded before, the same way
ExpoFabricView.updatePropsalready worked for UIKit views.[iOS] Fixed
matchContentshosts sometimes being laid out at a stale size. Regression from #48059.[iOS] Fixed an infinite main-thread layout loop (frozen UI, watchdog kill on backgrounding) when a SwiftUI host with
matchContentsand Yoga persistently disagree on the content size, e.g. with the Button Shapes accessibility setting enabled. Synchronous size commits are now budgeted per run-loop turn; over-budget updates are coalesced on the view and committed asynchronously on the next turn, and no-op size updates no longer dirty the layout. (#48058, #48059[iOS] Fixed the
ExpoModulesProviderlookup missing the generated class when the appnamestarts with a digit, which registered no native modules and left release builds on a blank screen.[iOS] Fixed the tap that closes a SwiftUI menu also pressing the React Native view underneath it.
[Android] Fixed hosted Compose views missing layout after reattachment or in-place configuration changes.
[iOS] Fixed infinite recursion and
EXC_BAD_ACCESSwhen encoding nativeDatevalues to JavaScript. (#48239, #48240[iOS] Concurrent functions build on the new two-phase
createAsyncFunctionfromexpo-modules-jsiagain, instead of wiring the promise themselves. This also restores rejecting the returned promise (rather than throwing synchronously) when the app context is lost or argument decoding fails.[Android] Support
android.graphics.Colorarguments and props on Android below API 26 by adding aColorCompatwrapper, since the class-basedColorAPI (Color.valueOfand the float accessors) only exists on API 26 and above.PlatformColorvalues now resolve below API 26 too, via React Native's ARGB-int color path.[Android] Fix
Recordarguments crashing with aNullPointerExceptionin R8-optimized release builds when converted through the reflection fallback path.[Android] Keep the
Recordmarker interface so its consumer ProGuard rule keeps matching after R8 optimization removes empty marker interfaces.[Android] Fix nested
Hostdouble-composing children.- removed
[Internal] Remove
EventEmitterre-export global type indirection [iOS] Fix Expo DevTools Network response bodies for JSON content types with parameters.
[iOS] Resolve the key window from the foregrounded scene in
currentViewController()so it keeps working with multiple scenes, and exposeUtilities.keyWindow()for modules to reuse.[iOS] Fixed a stack overflow crash when converting to JavaScript a
Convertiblevalue that keeps the defaultconvertResultimplementation, such asCMTime. The value now converts toundefinedand logs a warning.[iOS] Measure hosted React Native views where SwiftUI placed them, instead of at their Yoga box.
[Android] Measure hosted React Native views where Jetpack Compose placed them, instead of at their Yoga box.
[Android] Bump the Gradle plugin's Kotlin version to 2.2.21.
[Android] Fixed
ActivityResultLauncher.launch()throwingIllegalStateException: Attempting to launch an unregistered ActivityResultLauncherafter the Activity is recreated, by registering the launcher again against the live Activity.
Others
[iOS] Bumped
@expo/expo-modules-macros-pluginto0.8.0, which emits the two-phase async@JSbindings.[Android] Make
expo-module-gradle-plugincompatible with Android Gradle Plugin 9.[Android] Ignore already-settled promises.
iOS Turn
getModule(implementing:)into a public function[iOS] Added
SceneGeometryfor reading bounds, safe area, display scale and interface orientation from the scene a view belongs to.[iOS] Added
SceneGeometry.foregroundScene(), which returns nil when no scene is on screen so callers can avoid presenting UI into a background scene.Removed Quick and Nimble in favor of Swift Testing.
Migrated from deprecated react-native-worklets WorkletRuntime API
executeSyncto up-to-daterunSync.runSyncis available since 0.7.0.Added internal
ExpoModulesProviderModuleNamelookup key forExpoModulesProviderclass.[iOS] Allow ExpoSwiftUI child collections to reconcile children using a string-based identity.
- 57.x
57.0.9 – 57.0.2315 releases without a noteShow each
- 57.0.2314 Oct 2026no note
- 57.0.2212 Oct 2026no note
- 57.0.216 Oct 2026no note
- 57.0.2029 Sep 2026no note
- 57.0.1924 Sep 2026no note
- 57.0.1811 Sep 2026no note
- 57.0.178 Sep 2026no note
- 57.0.164 Sep 2026no note
- 57.0.151 Sep 2026no note
- 57.0.1426 Aug 2026no note
- 57.0.1324 Aug 2026no note
- 57.0.1220 Aug 2026no note
- 57.0.1114 Aug 2026no note
- 57.0.106 Aug 2026no note
- 57.0.94 Aug 2026no note
57.0.7
22 Jul 2026Reading the note…
57.0.6
17 Jul 2026Reading the note…
57.0.5
15 Jul 2026Reading the note…
57.0.4
15 Jul 2026Reading the note…
57.0.3
7 Jul 2026Reading the note…
57.0.2
3 Jul 2026Reading the note…
57.0.1
30 Jun 2026Reading the note…
57.0.0
25 Jun 2026Reading the note…
- 56.x
56.0.26 – 56.0.272 releases without a noteShow each
- 56.0.2729 Sep 2026no note
- 56.0.2617 Sep 2026no note