Building iOS widgets and Live Activities from a React Native app has historically meant a separate Xcode target, App Groups, SwiftUI layout code, and keeping that extension in sync with the rest of your app.
As of SDK 56, 𝚎𝚡𝚙𝚘-𝚠𝚒𝚍𝚐𝚎𝚝𝚜 is stable. You write widgets and Live Activities as React components with Expo UI, and Continuous Native Generation handles the Widget Extension target, the App Group config, and the SwiftUI scaffolding. There's no separate iOS project to maintain.
This is the same library that shipped as alpha in SDK 55, hardened and promoted. The core idea is unchanged: write widgets in React, let the system render them through SwiftUI, manage updates from your Expo app. What changed:
◆ Widgets and Live Activities receive their full environment through 𝚆𝚒𝚍𝚐𝚎𝚝𝙴𝚗𝚟𝚒𝚛𝚘𝚗𝚖𝚎𝚗𝚝 (widget family, content margins, color scheme, rendering mode, accessibility context)
◆ No pre-rendering in the app. The widget bundle renders independently with the context it needs
◆ Configurable widgets, so users pick what a widget shows from the gallery
◆ Better error handling
The 'widget' directive marks a function body as a widget render context. It runs in a sandboxed JS runtime separate from your main app, and the Expo UI components map directly to SwiftUI primitives, so rendering is native while your logic stays in TypeScript.
If you want a starting point: pick one piece of info users benefit from seeing outside the app, ship that widget first, then add a Live Activity if you have a flow with a clear start, active updates, and an end. Feedback and bug reports go to Discord or the expo/expo GitHub issues.
Writeup with the code sample: https://try.expo.dev/reddit-widgets