workflows/workflows/agent-environment-setup/platforms/codex/skills/expo-app/SKILL.md
Use when building or maintaining Expo applications: SDK 52+ features, EAS Build and Submit pipelines, OTA updates with expo-updates, native module integration via config plugins, push notifications with expo-notifications, and cross-platform testing.
npx skillsauth add cubetiq/cubis-foundry expo-appInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Guide the design and implementation of production-grade Expo applications using SDK 52+, covering EAS Build pipelines for iOS and Android, over-the-air update strategies, native module integration through config plugins and Expo Modules API, push notification delivery with expo-notifications, and cross-platform testing workflows.
Start with npx create-expo-app using the latest SDK template because Expo SDK versions pin compatible library versions, and starting from the template avoids version mismatch issues that cause build failures.
Choose between managed and development builds early because managed workflow uses Expo Go for rapid iteration but limits native module access, while development builds require EAS Build but support any native code.
Configure EAS Build profiles for development, preview, and production because each environment needs different signing credentials, environment variables, and optimization settings. Define all three in eas.json from day one.
Use expo-dev-client for development builds instead of Expo Go because development builds include your custom native modules and config plugins while retaining fast refresh, whereas Expo Go only supports Expo SDK libraries.
Implement OTA updates with expo-updates and a channel-based release strategy because OTA updates skip app store review for JavaScript and asset changes, and channels let you target updates to specific build profiles (production, staging).
Set a runtime version policy that ties updates to native compatibility because an OTA update targeting a different native binary crashes on launch. Use runtimeVersion: { policy: "appVersion" } or "fingerprint" to prevent mismatches.
Add native modules through config plugins before resorting to bare ejection because config plugins modify the native project at build time without requiring you to manage Xcode or Gradle files directly, keeping the project upgradeable.
Use the Expo Modules API for custom native code because it provides a unified Swift and Kotlin API with automatic TypeScript type generation, avoiding the complexity of React Native's bridge or Turbo Module system.
Implement push notifications with expo-notifications and register tokens on the server because push delivery requires a device token mapped to a user, and tokens change across reinstalls so the server must handle re-registration.
Handle notification permissions with graceful degradation because iOS requires explicit permission and Android 13+ requires POST_NOTIFICATIONS permission. Always check and request before attempting to register, and provide fallback UX.
Configure deep linking with expo-router file-based routing because universal links (iOS) and app links (Android) require consistent URL handling, and expo-router maps file paths to routes automatically with type safety.
Store secrets in EAS Secrets, never in app.config.js or source control because build-time secrets (API keys, signing credentials) must not appear in the JavaScript bundle or git history.
Use expo-image instead of React Native's Image component because expo-image supports modern formats (AVIF, WebP), disk and memory caching, blur hash placeholders, and transitions out of the box.
Write platform-specific tests with Jest and @testing-library/react-native because cross-platform code often has platform-specific branches, and testing both paths prevents regressions that only appear on one platform.
Set up EAS Submit for automated app store delivery because manual uploads are error-prone and slow. EAS Submit handles signing, metadata, and upload to App Store Connect and Google Play Console.
Monitor OTA update adoption with expo-updates runtime API because you need to know what percentage of users have received an update and whether any update caused a crash spike before rolling forward.
../android-emulator-testing/SKILL.md for live Android device evidence, ../ios-simulator-testing/SKILL.md for live iOS simulator evidence, and ../web-testing/SKILL.md only for browser-targeted Expo web flows.## Project Architecture
[Project structure, navigation, and native module decisions]
## Build Configuration
[eas.json profiles, signing, environment variables]
## Implementation
[Feature code with platform-specific handling and type safety]
## Update Strategy
[OTA channels, runtime versioning, rollback plan]
## Testing Plan
[Unit tests, E2E tests, platform-specific scenarios]
| File | Load when |
| ---------------------------------- | ------------------------------------------------------------------------------------------ |
| references/eas-build-config.md | Configuring EAS Build profiles, signing credentials, or environment variables. |
| references/over-the-air-updates.md | Setting up expo-updates channels, runtime versioning, or monitoring update adoption. |
| references/native-modules.md | Adding config plugins, using Expo Modules API, or integrating third-party native code. |
| references/testing.md | Expo unit-test setup, platform-specific test ownership, OTA validation, or mobile runtime handoff rules. |
tools
Use when investigating latest vendor behavior, comparing tools or platforms, verifying claims beyond the repo, or gathering external evidence before implementation.
documentation
Use when designing database schemas, normalization strategies, indexing plans, query optimization, and migration workflows for relational, document, or hybrid data stores.
development
Use when writing, reviewing, or refactoring modern C#/.NET code, including minimal APIs, records, async streams, pattern matching, DI lifetimes, and memory-efficient performance tuning.
development
Use when conducting code reviews, building review checklists, calibrating review depth, providing structured feedback, or establishing team review practices. Covers review methodology, feedback patterns, automated checks, and batch review strategies.