- Home
- Skills
- Mobile Development
- Expo Production Pack
Works with the AI Agents you already use
Expo Production Pack
Eight agent skills that stop your AI agent from guessing about EAS builds, OTA updates, deep links, push, Live Activities and App Store review in Expo SDK 57 apps.
$24
Expo Production Pack
Example session with this skill installed
My Live Activity deep link works when I tap the Lock Screen banner, but tapping the Dynamic Island just opens the app on the home screen. I'm using expo-widgets on SDK 57 with a widgetURL modifier, and I start the activity with a push. How do I fix it?
- Read your context and instructions
- Compiled the expo production
Summary
The island ignores your link because of where widgetURL is applied, not because of your router. Move the URL to the activity's url attribute and send it in the push.
Why it happens
Compact leading, compact trailing and minimal presentations only honour a widgetURL applied to the DynamicIsland itself. The widgetURL modifier from @expo/ui is a view modifier (content.widgetURL(url)), so it lands inside a region view and the island skips it. SwiftUI Link only works in expanded regions. That is why the banner deep-links and the island does not.
expo-widgets applies exactly one URL at the island level: the activity-level url attribute, read from context.attributes.url. The same attribute is applied to the banner.
Fix
Push-to-start payload (apns-push-type: liveactivity, topic <bundle id>.push-type.liveactivity):
{
"aps": {
"timestamp": 1791590400,
"event": "start",
"attributes-type": "LiveActivityAttributes",
"attributes": { "url": "courier://orders/A1" },
"content-state": {
"name": "DeliveryActivity",
"props": "{\"orderId\":\"A1\",\"etaMinutes\":15}"
},
"alert": { "title": "Order A1", "body": "Your courier is on the way" }
}
}
Starting locally instead? Pass the URL as the second argument: Delivery.start(props, 'courier://orders/A1').
Checklist
| Check | Why |
|---|---|
Remove the widgetURL modifier from the banner | Two widgetURLs in one hierarchy is undefined behaviour |
Use your app's custom scheme URL | expo-router routes it like any other deep link |
| Need a different target later? End and restart the activity | url is a static attribute, fixed for the activity's lifetime |
DeliveryActivity registered on the device | The app must have run createLiveActivity('DeliveryActivity', ...) once since install |
Next steps
- Send the payload with the pack's
send-liveactivity.mjsscript against the sandbox APNs endpoint from a development build. - Tap the compact island, the minimal island (start a second activity from another app) and the banner; all three should open
courier://orders/A1.
Connects securely to your tools. The creator never sees your data.
About this skill
Agents write Expo screens well. They get production wrong: invented eas.json keys, secrets in EXPO_PUBLIC_ variables, updates that never reach a build because the channel was never set, an AASA file behind a redirect, assetlinks.json with the upload key instead of the Play signing key, push tokens fetched before the Android channel exists, Dynamic Island taps that ignore your deep link.
This pack gives the agent the rules it needs for each of those, checked against Expo SDK 57 source and docs, Apple and Google documentation, and current store policy text.
What's inside
- expo-production: routes to the right guide, pre-launch checklist, SDK 57 and 58 changes that affect production.
- expo-eas-builds: profiles, environment variables and secrets, signing, caching, monorepos, reading failed build logs.
- expo-updates: channels and branches, runtimeVersion and fingerprint, staged rollouts, rollbacks, what may ship OTA.
- expo-deep-links: Universal Links, App Links, AASA and assetlinks.json hosting, expo-router mapping, cold-start navigation.
- expo-push-notifications: APNs and FCM V1 credentials, push API, receipts and every error code, background push, channels.
- expo-widgets-live-activities: expo-widgets, Live Activities, push-to-start tokens, APNs payloads, Dynamic Island deep links.
- expo-store-submission: EAS Submit, build numbers, TestFlight and Play tracks, privacy manifests, account deletion, common rejections.
- nativewind-gotchas: NativeWind v4 and v5, Tailwind v4 config, the lightningcss pin, rtl:, dark mode.
Scripts included
Six zero-dependency Node scripts: an eas.json linter, a .well-known file checker, an Expo push sender with receipt polling, an APNs Live Activity sender, a privacy manifest generator and a NativeWind config checker.
Things it knows that the docs get wrong
enablePushNotificationsin expo-widgets writesExpoWidgets_EnablePushNotifications, not the key the docs name.NSSupportsLiveActivitiesFrequentUpdatesset by hand is overwritten on prebuild; only the plugin'sfrequentUpdatesoption sets it.
Versions
Expo SDK 57, React Native 0.86, EAS CLI 24, NativeWind 4.2 and 5.0 RC. Notes where the SDK 58 beta changes behaviour. Reviewed after each stable Expo SDK release.
Works with Claude Code, Codex, Gemini CLI, Cursor and any agent that reads SKILL.md.
How to use
Skills on Agensi run inside your AI agent. Copy the prompt, paste it into your agent, and it connects to Agensi and installs this skill for you. If a payment is needed, your agent shows it to you first.
Reviews
No reviews yet
Be one of the first to try it. Every listed skill passes our trust checks below.
Security scanned
Passed our 8-point scan before listing
Fresh listing
Recently published to Agensi
Money-back guarantee
Doesn't do what its page promises? You get your money back.
Trust & safety
Security scanned
Verified clean 7 days ago
- Passed all security checks, Safe to install
Requires