<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/an-early-look-at-expo-modules-2-0-expo-blog-fqyfapxkh" -->

---
title: An early look at Expo Modules 2.0 — Expo blog | daily.dev
description: Expo Modules 2.0 replaces the 1.0 DSL (built on Swift result builders) with plain annotated Swift and Kotlin classes: a module becomes a class with @JS-marked...
canonical: https://daily.dev/posts/an-early-look-at-expo-modules-2-0-expo-blog-fqyfapxkh
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: An early look at Expo Modules 2.0 — Expo blog | daily.dev
og:description: Expo Modules 2.0 replaces the 1.0 DSL (built on Swift result builders) with plain annotated Swift and Kotlin classes: a module becomes a class with @JS-marked...
og:url: https://daily.dev/posts/an-early-look-at-expo-modules-2-0-expo-blog-fqyfapxkh
og:image: https://api.daily.dev/og/posts/FqyFApxKH.png
og:image:alt: An early look at Expo Modules 2.0 — Expo blog
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# An early look at Expo Modules 2.0 — Expo blog

**[Expo Blog](https://daily.dev/sources/expo-blog)** · 11 min read · 2 upvotes · 0 comments

## Summary

Expo Modules 2.0 replaces the 1.0 DSL (built on Swift result builders) with plain annotated Swift and Kotlin classes: a module becomes a class with @JS-marked methods and properties, no definition() function or Name(...) boilerplate. Records, shared objects, and events follow the same pattern using @Record, @SharedObject, and @Event macros. The core macros already ship in SDK 57 for iOS (experimental, undocumented), with an official beta landing in SDK 58 alongside Android support. Because the @JS macro reads Swift function signatures at build time instead of relying on runtime reflection, synchronous calls are 2.5 to 5.6x faster than the 1.0 API on the same SDK; SDK 56's removal of the Objective-C++ layer already made calls 1.5-2x faster than SDK 55. An expo-migrate-module coding-agent skill can automatically convert existing modules from 1.0 to 2.0 incrementally, and generated TypeScript declarations from native code are planned next.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://expo.dev/blog/an-early-look-at-expo-modules-2-0>

## Questions this post answers

### How much faster are synchronous calls in Expo Modules 2.0 compared to the 1.0 DSL API?

Synchronous calls using the @JS macro in Expo Modules 2.0 are 2.5 to 5.6 times faster than the same calls made through the Expo Modules 1.0 API on the same SDK. This is because the @JS macro reads Swift function signatures at build time, avoiding the runtime reflection-style type conversion and per-call allocation that the 1.0 API performs on every call. Async calls see a smaller gain since both APIs share the same promise machinery, measured on an iPhone 16 Pro running iOS 27.

_Track native module performance changes like Expo's 2.0 macro rewrite on daily.dev before upgrading._

### How do I migrate an existing Expo Module from the 1.0 DSL to Expo Modules 2.0?

Migration can happen incrementally: add @ExpoModule to the existing class, keep the current definition() function, and move functions and properties to @JS one at a time since both APIs are merged and coexist in the same module. Alternatively, run npx skills@latest use expo/skills@expo-migrate-module with an agent like claude-code, codex, or cursor, which migrates the Swift side automatically and reports anything it could not convert.

_Developers planning a phased native module migration can follow Expo API changes on daily.dev._

### What platforms and SDK versions currently support Expo Modules 2.0?

Expo Modules 2.0 core macros (@ExpoModule, @JS, @Record, @SharedObject, @Event) ship experimentally on iOS starting in SDK 57, though undocumented and subject to change. Android support and view components (@ExpoView) are still in progress. An official, documented beta including guides, references, and generated TypeScript declarations is planned to arrive with the SDK 58 release.

_Follow SDK 58 beta milestones for Expo Modules 2.0 rollout on daily.dev before committing to it._

## Similar posts on daily.dev

- [What happened at AppJS 2026? Highlights, new products, and plans for the future](https://daily.dev/posts/what-happened-at-appjs-2026-highlights-new-products-and-plans-for-the-future-2cm18irez) · Expo Blog · 0 upvotes · 0 comments
- [Universal Components, One-Line Nitro Migrations, and 6 Lines of C\+\+ That Will Ruin Your Life](https://daily.dev/posts/universal-components-one-line-nitro-migrations-and-6-lines-of-c-that-will-ruin-your-life-wy93eppce) · ITNEXT · 1 upvotes · 0 comments

---

Tags: [#swift](https://daily.dev/tags/swift), [#react-native](https://daily.dev/tags/react-native), [#kotlin](https://daily.dev/tags/kotlin)

[View this post on daily.dev](https://daily.dev/posts/an-early-look-at-expo-modules-2-0-expo-blog-fqyfapxkh)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"An early look at Expo Modules 2.0 — Expo blog","url":"https://daily.dev/posts/an-early-look-at-expo-modules-2-0-expo-blog-fqyfapxkh","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/an-early-look-at-expo-modules-2-0-expo-blog-fqyfapxkh"},"datePublished":"2026-09-08T16:31:46.311Z","dateModified":"2026-09-14T09:04:35.702Z","description":"Expo Modules 2.0 replaces the 1.0 DSL (built on Swift result builders) with plain annotated Swift and Kotlin classes: a module becomes a class with @JS-marked...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/6a7290cedf3e9b65dd00b63729d3ec78?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/6a7290cedf3e9b65dd00b63729d3ec78?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Expo Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Expo Blog","logo":"https://media.daily.dev/image/upload/s--E7LK6L3y--/f_auto,q_auto/v1774179051/logos/expo-blog?_a=BAMAMiWQ0","url":"https://daily.dev/sources/expo-blog"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/an-early-look-at-expo-modules-2-0-expo-blog-fqyfapxkh","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":2},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"swift,react-native,kotlin","timeRequired":"PT11M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Expo Blog","item":"https://daily.dev/sources/expo-blog"},{"@type":"ListItem","position":3,"name":"An early look at Expo Modules 2.0 — Expo blog"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/an-early-look-at-expo-modules-2-0-expo-blog-fqyfapxkh#faq","mainEntity":[{"@type":"Question","name":"How much faster are synchronous calls in Expo Modules 2.0 compared to the 1.0 DSL API?","acceptedAnswer":{"@type":"Answer","text":"Synchronous calls using the @JS macro in Expo Modules 2.0 are 2.5 to 5.6 times faster than the same calls made through the Expo Modules 1.0 API on the same SDK. This is because the @JS macro reads Swift function signatures at build time, avoiding the runtime reflection-style type conversion and per-call allocation that the 1.0 API performs on every call. Async calls see a smaller gain since both APIs share the same promise machinery, measured on an iPhone 16 Pro running iOS 27. Track native module performance changes like Expo's 2.0 macro rewrite on daily.dev before upgrading."}},{"@type":"Question","name":"How do I migrate an existing Expo Module from the 1.0 DSL to Expo Modules 2.0?","acceptedAnswer":{"@type":"Answer","text":"Migration can happen incrementally: add @ExpoModule to the existing class, keep the current definition() function, and move functions and properties to @JS one at a time since both APIs are merged and coexist in the same module. Alternatively, run npx skills@latest use expo/skills@expo-migrate-module with an agent like claude-code, codex, or cursor, which migrates the Swift side automatically and reports anything it could not convert. Developers planning a phased native module migration can follow Expo API changes on daily.dev."}},{"@type":"Question","name":"What platforms and SDK versions currently support Expo Modules 2.0?","acceptedAnswer":{"@type":"Answer","text":"Expo Modules 2.0 core macros (@ExpoModule, @JS, @Record, @SharedObject, @Event) ship experimentally on iOS starting in SDK 57, though undocumented and subject to change. Android support and view components (@ExpoView) are still in progress. An official, documented beta including guides, references, and generated TypeScript declarations is planned to arrive with the SDK 58 release. Follow SDK 58 beta milestones for Expo Modules 2.0 rollout on daily.dev before committing to it."}}]}
```

