Feature Requests

With Expo, you can write iOS and Android experiences in JavaScript using React Native.
[expo-widgets] Expose ActivityKit staleDate on LiveActivity start/update
Building iOS Live Activities for a motorcycle ride app and keep hitting the same wall: expo-widgets@56.0.15 doesn't let me pass staleDate to ActivityKit. Native side hardcodes staleDate: nil when it builds ActivityContent, no way to set it from JS. The lock screen shows current speed + distance + elapsed time, fed by a background location task running every ~10s. Rider goes into a tunnel, GPS dies, OS may suspend the bg task entirely. The activity just freezes on whatever the last reading was. Phone shows "47 mph" for 30 minutes while the rider's at lunch. Apple's whole answer to this is ActivityContent.staleDate. Once the wall clock passes it, iOS dims the UI and pauses native timers automatically. What I'd want exposed: an optional staleDate?: Date | null parameter on both LiveActivityFactory.start(props, url?, staleDate?) and LiveActivity.update(props, staleDate?). Nil keeps current behavior. We've been carrying a ~50-line pnpm patch since May doing exactly this. PR with the implementation: https://github.com/expo/expo/pull/46343 Implementation note for anyone reviewing: the JS Date is passed over the JSI bridge as a millisecond timestamp and converted to Date at the expo-widgets module boundary (Double? → Date(timeIntervalSince1970:)), so the PR is self-contained — it works without any change to expo-modules-core. (Earlier versions of this patch relied on a Date: Convertible fix in core, because that extension throws an ArgumentCastException on the Double timestamps getTime() produces over the bridge. Converting at the boundary sidesteps that entirely for staleDate.) That core bug is still real and worth fixing on its own — the existing LiveActivity.end() path passes JS timestamps straight into Date? params and hits the same cast exception — so there's a separate, independent PR for it: https://github.com/expo/expo/pull/46340 . It's no longer a prerequisite for staleDate, just a related cleanup.
0
Allow disabling the dev menu while keeping Fast Refresh (for E2E / agent-driven testing)
## Summary Add a way to fully suppress the dev menu (shake, Cmd+D / Cmd+M, Android dev notification, programmatic triggers) on a development build while keeping HMR, Fast Refresh, and the Metro connection intact. Ideally exposed as one of: DevSettings.setDevMenuEnabled(false) at runtime, or expo.developmentClient.devMenu: "disabled" in app.json , or EXPO_DEV_MENU=disabled env var for ephemeral CI / agent runs. ## Motivation Maestro E2E tests against a development build are increasingly common, especially in AI-assisted workflows where an agent iterates on UI, runs maestro test , reads results, and tries again. The dev build is preferred over preview/release because the rebuild cycle is seconds vs. minutes — critical for tight agent loops. The dev menu is the single biggest source of flakiness in this loop: Simulated input misfires the shake gesture Cmd+D / Cmd+M can be triggered by the harness or focus changes Android's persistent dev notification gets tapped by coordinate-based input The native SwiftUI dev menu on iOS lives in a separate UIWindow and is invisible to Maestro's text matching, so it can't be reliably dismissed from a flow Today the only "complete" mitigation is getUseDeveloperSupport() = false , which also disables HMR — defeating the purpose of the dev build. DevSettings.setIsShakeToShowDevMenuEnabled(false) exists but only covers shake. The Maestro maintainers' documented recommendation for this problem is "Perform a Release rather than a Debug build" (see mobile-dev-inc/Maestro discussion #3041 ). That works but kills the fast iteration loop that makes the dev build worth using in the first place. ## Proposed API ```ts import { DevSettings } from 'react-native'; DevSettings.setDevMenuEnabled(false); // suppress ALL dev menu entry points Or Expo-level config in app.json: ```json { "expo": { "developmentClient": { "devMenu": "disabled" } } } Fast Refresh, HMR, error overlays (optionally — agents benefit from those), and the Metro connection remain on. Only the menu is gone. ## Alternatives considered Preview/release build — too slow for agent iteration (minutes per cycle) Maestro subflow that dismisses the menu if visible — only partially works; iOS native dev menu is in a separate UIWindow and isn't matchable setIsShakeToShowDevMenuEnabled(false) — covers shake only; keyboard shortcuts and Android notification still fire getUseDeveloperSupport() = false — kills HMR, defeats the use case ## Why now Agent-driven UI iteration (Claude Code, Cursor, etc.) is a fast-growing workflow. Maestro is the de facto E2E tool for it. The dev menu is the most common cause of false-negative test runs in this loop. A single flag would remove that entire class of flake without forcing teams onto the slow release-build path. ## Repro Happy to provide a minimal repro repo on request — the behavior is reliably triggered by any npx create-expo-app + expo-dev-client + a Maestro flow that exercises gestures.
0
Load More