Skip to main content
reopt Handbook
reopt Handbook
Expo Enterprise Production

New Architecture

SDK 56 Breaking ChangesNew Architecture Deep DiveReact 19.2 Concurrency Patterns

Native Extensions

Expo UI Nativeexpo-widgets Home Screen WidgetsExpo Modules API v2 Native Extensions

Build and Release

Advanced EAS Build PipelinesEAS Update OTA StrategySecurity, Signing, and Compliance

Operations and Quality

Performance Monitoring and ProfilingTesting StrategyEnterprise Distribution and MDM

Appendix

Verification ReportUpdates
Handbook›Expo Enterprise Production›expo-widgets Home Screen Widgets
한국어English

expo-widgets Home Screen Widgets

iOS WidgetKit, Live Activities, and data synchronization patterns with Expo.

Key takeaways

  • expo-widgets defines iOS home screen widgets and Live Activities in React, and its Config Plugin generates the Widget Extension, App Group, and entitlements during prebuild.
  • The SDK 56 changelog marks widgets and Live Activities stable while the API reference still shows an alpha banner, so pin versions and keep device regression tests.
  • Define widgets with createWidget, matching the component name to widgets[].name, and write the 'widget' directive inside the render function.
  • Live Activities use createLiveActivity with start/update/end, plus getPushToken and push-to-start listeners for server-triggered flows.
  • Keep App Group data small and serializable, never store images, tokens, or PII, and discard stale contentDate push updates.

Overview

expo-widgets lets teams define iOS home screen widgets and Live Activities with React components and Expo UI. The Config Plugin creates the Widget Extension, App Group, and entitlements during prebuild.

How to read the SDK 56 status

The SDK 56 changelog says iOS Widgets and Live Activities have moved to stable. The current API reference still shows an alpha banner. For production-critical features, pin package versions and keep real device regression tests.

Architecture

Config Plugin Baseline

{
  "expo": {
    "plugins": [
      [
        "expo-widgets",
        {
          "groupIdentifier": "group.com.company.app",
          "enablePushNotifications": true,
          "widgets": [
            {
              "name": "StatusWidget",
              "displayName": "Status",
              "description": "Shows the most important status at a glance.",
              "supportedFamilies": ["systemSmall", "systemMedium"]
            }
          ]
        }
      ]
    ]
  }
}

Keep this plugin configuration as the source of truth. Manual native target edits can be lost when Continuous Native Generation regenerates projects.

Widget Component Pattern

import { Text, VStack } from '@expo/ui/swift-ui';
import { font } from '@expo/ui/swift-ui/modifiers';
import { createWidget, type WidgetEnvironment } from 'expo-widgets';

type StatusWidgetProps = {
  label: string;
  count: number;
};

function StatusWidget(props: StatusWidgetProps, env: WidgetEnvironment) {
  'widget';

  return (
    <VStack>
      <Text modifiers={[font({ weight: 'bold', size: 16 })]}>{props.label}</Text>
      <Text>{props.count}</Text>
      <Text>{env.widgetFamily}</Text>
    </VStack>
  );
}

export default createWidget('StatusWidget', StatusWidget);

The widget name must match widgets[].name in app config.

Live Activities

Live Activities show real-time information on the lock screen and Dynamic Island.

PatternPurpose
createLiveActivitycreate the Live Activity factory
start(props, deepLink)start an activity from the app
update(props)update the activity state
end(policy, props, contentDate)end and prevent stale payloads
getPushToken()get the activity-specific APNs token
addPushToStartTokenListenersupport server-triggered push-to-start flows

Production Data Rules

  • Keep widget props small and serializable.
  • Do not store large images, tokens, or PII in the App Group.
  • Use one route contract for widgets, Live Activities, and push notifications.
  • Include server timestamps in Live Activity push payloads and discard stale contentDate updates.
  • Capture systemSmall, systemMedium, and lock screen accessory families separately.

Caveats

  • The changelog and API reference status labels are not perfectly aligned. Check both every release.
  • iOS is the current target. Android Glance support needs separate native work or future Expo support.
  • Test in development builds, not only Expo Go.
  • Widget networking and interactive elements are constrained.
  • App Group storage is for lightweight state only.

Related docs

Testing Strategy

E2E, native module tests, visual regression, and release gates for Expo SDK 56 apps.

Expo UI Native

Declarative SwiftUI, Jetpack Compose, Universal API, and production rollout patterns.

Cmd. /agents

Claude Code Command Master · On current versions, explain how to manage subagents.

Expo UI Native

Declarative SwiftUI, Jetpack Compose, Universal API, and production rollout patterns.

Expo Modules API v2 Native Extensions

Swift/Kotlin modules, inline modules, type generation, and testing strategy.

On this page

OverviewArchitectureConfig Plugin BaselineWidget Component PatternLive ActivitiesProduction Data RulesCaveats