# What changed in expo-modules-macros

> 72 changes in expo-modules-macros 0.1 to 0.21 from its official release notes, upgrade guides and advisories: 9 breaking, 13 new APIs and options. Each one cited. Sources checked 2026-10-18. HTML: https://unstale.sh/npm/expo-modules-macros/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## expo-modules-macros 0.21

### Behavior and default changes

- Generated @Record code now emits decode and encode witnesses. (0.21.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.21.0)

### Tooling

- The plugin is now built and published for Linux. (0.21.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.21.0)

### Fixes and other changes

- Reports @JS members that share a JS name on one object. (0.21.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.21.0)

## expo-modules-macros 0.20

### New APIs and options

- The scanner wrapper accepts a timeout option. (0.20.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.20.0)

### Tooling

- scan-exports reports platforms, deprecations, access levels, and default values. (0.20.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.20.0)

### Fixes and other changes

- Closure types are reported in @Record properties and @Event and @Union payloads. (0.20.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.20.0)
- @JS functions and setters that return nothing are bound through the Void overload. (0.20.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.20.0)

## expo-modules-macros 0.19

### Behavior and default changes

- The conformance assertion now accepts non-copyable types. (0.19.1) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.19.1)
- @JS now allows free-form Any return values and properties. (0.19.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.19.0)
- scan-exports now reports nested types. (0.19.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.19.0)

## expo-modules-macros 0.18

### Breaking changes

- Drops ownership specifiers from parameters and rejects `inout` and `isolated`. (0.18.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.18.0)

### Behavior and default changes

- Binds backticked member names under their bare JavaScript names. (0.18.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.18.0)

### Fixes and other changes

- Reports backticked names without their backticks. (0.18.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.18.0)

## expo-modules-macros 0.17

### Behavior and default changes

- The macros emit a borrowing constructor this. (0.17.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.17.0)

### Fixes and other changes

- The macros emit function-form undefined/null. (0.17.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.17.0)

## expo-modules-macros 0.16

### Behavior and default changes

- Supports closure arguments in @JS functions and initializers. (0.16.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.16.0)

### Tooling

- Reports a module's classes in scan-exports. (0.16.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.16.0)

### Fixes and other changes

- Maps numeric Swift types to JS primitives in scan-exports. (0.16.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.16.0)

## expo-modules-macros 0.15

### Fixes and other changes

- Only unowned @Union values are decoded, and decoding is gated on the payload's decodableKinds. (0.15.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.15.0)

## expo-modules-macros 0.14

### Breaking changes

- The package was renamed to expo-modules-macros. (0.14.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.14.0)
- The binary was renamed to ExpoModulesMacros. (0.14.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.14.0)

## expo-modules-macros 0.13

### Behavior and default changes

- Accepts free-form Any property types, allowing @Record properties to use those types. (0.13.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.13.0)

### Fixes and other changes

- Silences the optional-to-Any coercion warning in free-form encodes using @Record. (0.13.1) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.13.1)

## expo-modules-macros 0.12

### Fixes and other changes

- Resolves ref type nodes against the scanned surface. (0.12.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.12.0)
- Reports @Event members in scan-exports, making them visible in scanned exports. (0.12.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.12.0)
- Reports Enumerable enums in scan-exports, making them visible in scanned exports. (0.12.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.12.0)
- Reports @Union types in scan-exports, making them visible in scanned exports. (0.12.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.12.0)

## expo-modules-macros 0.11

### Breaking changes

- Reports each scanned module's platforms instead of filtering by one. (0.11.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.11.0)

### New APIs and options

- Adds a macro that binds a view to its props type. (0.11.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.11.0)
- Adds a TypeScript wrapper around the scanner CLI. (0.11.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.11.0)
- Adds a macro that synthesizes PropName and PropSet. (0.11.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.11.0)

### Behavior and default changes

- Async bindings emit try only for throwing @JS members. (0.11.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.11.0)

## expo-modules-macros 0.10

### New APIs and options

- Adds a `.concurrent` option for running async members off the JS thread. (0.10.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.10.0)
- Adds a macro for typed N-case unions. (0.10.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.10.0)

### Tooling

- Test and example directories are pruned from the scan walk. (0.10.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.10.0)

## expo-modules-macros 0.9

### New APIs and options

- Accepts free-form Any argument types in @JS bindings. (0.9.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.9.0)

### Behavior and default changes

- Answers canImport for curated SDK frameworks based on the target platform. (0.9.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.9.0)

### Tooling

- Extends scan-modules output with autolinking metadata. (0.9.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.9.0)
- Evaluates #if conditions against a platform and defines. (0.9.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.9.0)
- Merges the scanner CLI into the macro plugin executable. (0.9.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.9.0)

## expo-modules-macros 0.8

### Behavior and default changes

- Async @JS bindings now decode before the asynchronous boundary using two-phase emission. (0.8.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.8.0)

## expo-modules-macros 0.7

### Behavior and default changes

- Async @JS return values are encoded on the JS thread. (0.7.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.7.0)
- Static shared-object members are bound to the _decorateSharedObject(constructor:) hook. (0.7.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.7.0)

## expo-modules-macros 0.6

### Breaking changes

- Removed the unused appContext from synthesized JSI hooks. (0.6.1) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.6.1)
- Converts @JS bindings through JavaScriptCodable instead of dynamic types. (0.6.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.6.0)

### Behavior and default changes

- Async @JS members are stamped with @JavaScriptActor. (0.6.2) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.6.2)
- Converts @Record JS-object fields through JavaScriptCodable. (0.6.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.6.0)

### Tooling

- Adds the scan-exports CLI subcommand. (0.6.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.6.0)

### Fixes and other changes

- The async @SharedObject receiver is unwrapped from an owning `this`. (0.6.2) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.6.2)
- Fixed invalid switch-expression code generation for omittable trailing arguments. (0.6.1) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.6.1)

## expo-modules-macros 0.5

### Behavior and default changes

- Members of @SharedObject are bound directly into the JS object via _decorateSharedObject. (0.5.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.5.0)

### Fixes and other changes

- Implicitly-unwrapped optional types are normalized before being spliced into expressions. (0.5.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.5.0)

## expo-modules-macros 0.4

### Behavior and default changes

- Synchronous @JS bindings now emit unowned-this closures. (0.4.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.4.0)

### Tooling

- Adds a CLI for scanning Swift source for Expo module macros. (0.4.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.4.0)

## expo-modules-macros 0.3

### Breaking changes

- The `Name(...)` DSL entry is dropped. (0.3.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.3.0)

### New APIs and options

- Adds an accessor macro for typed module and shared-object events. (0.3.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.3.0)

### Behavior and default changes

- Arity checks use ranges and throw `ArgumentsRangeMismatch`. (0.3.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.3.0)
- The module name is synthesized as `_jsName`. (0.3.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.3.0)

## expo-modules-macros 0.2

### Performance

- Primitive-only @JS bindings no longer capture the unused appContext. (0.2.1) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.2.1)

### Behavior and default changes

- Properties marked with @JS are bound directly into the JS object via _decorateModule. (0.2.2) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.2.2)
- Boundary types for @JS and @Record are checked for conformance at compile time. (0.2.1) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.2.1)
- @JS functions are bound directly into the JS object via _decorateModule. (0.2.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.2.0)

## expo-modules-macros 0.1

### Breaking changes

- Autolinking has been removed. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)
- Synthesized definition methods use synthesized instead of exposed. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)

### New APIs and options

- Classes marked with @ExpoModule automatically conform to AnyModule. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)
- Adds the @ExpoModule macro for module declarations. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)
- Adds the @JS macro for declaring JavaScript-facing members. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)
- Adds the @Record macro. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)
- Adds the @SharedObject macro. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)

### Behavior and default changes

- @Record properties are synthesized even when they lack @Field. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)
- Sync members marked with @JS are automatically stamped with @JavaScriptActor. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)

### Tooling

- Adds tool support for x86_64. (0.1.0) — [release notes](https://github.com/expo/expo-modules-macros/releases/tag/v0.1.0)
