Expo Deployment
kingstinct/react-native-healthkit
Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes
Add an iOS App Clip target to an Expo app. An agent skill from expo/skills.
$ npx skills add expo/skills --skill expo-app-clip -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install expo/skills expo-app-clip --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/expo/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/expo/skills/expo-app-clip .claude/skills/expo-app-clip && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "expo-app-clip" agent skill from https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-app-clip into .claude/skills/expo-app-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo-app-clip", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-app-clipType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add expo/skills --skill expo-app-clip -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install expo/skills expo-app-clip --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/expo/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/expo/skills/expo-app-clip .agents/skills/expo-app-clip && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "expo-app-clip" agent skill from https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-app-clip into .agents/skills/expo-app-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo-app-clip", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add expo/skills --skill expo-app-clip -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install expo/skills expo-app-clip --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/expo/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/expo/skills/expo-app-clip .cursor/skills/expo-app-clip && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "expo-app-clip" agent skill from https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-app-clip into .cursor/skills/expo-app-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo-app-clip", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/expo/skills.git --path plugins/expo/skills/expo-app-clip--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add expo/skills --skill expo-app-clip -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install expo/skills expo-app-clip --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/expo/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/expo/skills/expo-app-clip .gemini/skills/expo-app-clip && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "expo-app-clip" agent skill from https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-app-clip into .gemini/skills/expo-app-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo-app-clip", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install expo/skills expo-app-clipInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add expo/skills --skill expo-app-clip -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/expo/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/expo/skills/expo-app-clip .github/skills/expo-app-clip && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "expo-app-clip" agent skill from https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-app-clip into .github/skills/expo-app-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo-app-clip", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add expo/skills --skill expo-app-clip -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install expo/skills expo-app-clip --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/expo/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/expo/skills/expo-app-clip .opencode/skills/expo-app-clip && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "expo-app-clip" agent skill from https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-app-clip into .opencode/skills/expo-app-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo-app-clip", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
expo-app-clipAdd an iOS App Clip target to an Expo app. An agent skill from expo/skills.
Expo App Clip is an agent skill from expo/skills, published by the product's own GitHub organization. Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.
Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including reference files (for example `agents/openai.yaml` and `references/native-module.md`).
It sits in Mobile, covering Cross-platform mobile apps, iOS development and App store release. It works with Expo, iOS and App Store Connect. The repository describes itself as: A collection of AI agent skills for working with Expo projects and Expo Application Services. The licence is MIT.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d4f4840. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bunxeasbunnpxcurlexpoFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
may20.expo.appgithub.comAlso links to:
docs.expo.devsosumi.aiexpo.devdeveloper.apple.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Expo App Clip loads about 2.4k tokens when it runs, and up to ~3k if it reads all its reference files. Until then it costs about 61 tokens; SKILL.md has 879 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from expo/skills at commit d4f4840, republished under its MIT licence (© expo). 879 words, ~2,397 tokens.
.claude/skills/expo-app-clip/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Requirements. Adding the App Clip target is open source. Shipping one requires an Apple Developer Program membership and App Store review, and the AASA file must be served over HTTPS on your domain (any HTTPS host works; EAS Hosting is one option). Building via EAS Build or
bunx testflightuses your EAS plan's build minutes. See https://expo.dev/pricing and https://developer.apple.com/app-clips/.
Adds an iOS App Clip target to an Expo project. The Clip lives in targets/clip/, ships alongside the parent app, and is invoked from a URL on the app's domain via an Apple App Site Association (AASA) file.
The parent app's bundle ID becomes com.<username>.<app-name> and the Clip's is automatically derived as <parent>.clip (e.g. com.bacon.may20.clip).
bundleIdentifier and appleTeamIdbun create target warns if these are missing. Add to app.json:
{
"expo": {
"ios": {
"bundleIdentifier": "com.<username>.<app-name>",
"appleTeamId": "XX57RJ5UTD"
}
}
}bun create target clipThis installs @bacons/apple-targets, adds it to the plugins array in app.json, and writes:
targets/clip/expo-target.config.js — the target's config plugintargets/clip/Info.plist — Clip Info.plisttargets/clip/AppDelegate.swift, Assets.xcassets, etc.Pick a good icon or reuse the existing one defined in the app — check it with bunx expo config under the icon or ios.icon key.
The parent app and the Clip each need the Associated Domains entitlement pointing at the domain that hosts the AASA file.
In app.json, add both applinks: (parent) and appclips: (Clip invocation) entries:
{
"expo": {
"ios": {
"associatedDomains": [
"applinks:may20.expo.app",
"appclips:may20.expo.app"
]
}
}
}In targets/clip/expo-target.config.js, declare the Clip's entitlement:
/** @type {import('@bacons/apple-targets/app.plugin').ConfigFunction} */
module.exports = (config) => ({
type: "clip",
icon: "https://github.com/expo.png",
entitlements: {
"com.apple.developer.associated-domains": ["appclips:may20.expo.app"],
},
});If you skip this,
expo prebuildwill print:Apple App Clip may require the associated domains entitlement but none were found.
bunx setup-safariThis logs in to the Apple Developer account, registers com.bacon.may20, creates the App Store Connect entry, and prints:
apple-app-site-association JSON<meta name="apple-itunes-app"> tag with the iTunes app idApp Clips are invoked when iOS fetches https://<your-domain>/.well-known/apple-app-site-association and finds a matching appclips entry.
mkdir -p public/.well-known
touch public/.well-known/apple-app-site-associationPaste the JSON setup-safari printed, but add an appclips block for the Clip's full app ID (<TeamID>.<ClipBundleID>). The output of setup-safari only covers the parent app:
{
"applinks": {
"details": [
{
"appIDs": ["XX57RJ5UTD.com.bacon.may20"],
"components": [{ "/": "*", "comment": "Matches all routes" }]
}
]
},
"appclips": {
"apps": ["XX57RJ5UTD.com.bacon.may20.clip"]
},
"activitycontinuation": {
"apps": ["XX57RJ5UTD.com.bacon.may20"]
},
"webcredentials": {
"apps": ["XX57RJ5UTD.com.bacon.may20"]
}
}Notes:
Content-Type requirements beyond being served as-is. Expo Router static export serves files in public/ verbatim.appclips block is what lets a URL on the domain launch the Clip.webcredentials is used for sharing credentials between the website, parent app, and the App Clip.activitycontinuation is optional and used for sharing the link between mobile and desktop. Must be used with Head from expo-router — see https://docs.expo.dev/router/advanced/apple-handoff/Create src/app/+html.tsx (Expo Router's HTML shell) and add the tag from setup-safari. Create the versioned template if it doesn't exist:
bunx expo customize src/app/+html.tsxAdd the meta tag to the <head>:
import { ScrollViewStyleReset } from "expo-router/html";
export default function Root({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<head>
<meta charSet="utf-8" />
<meta httpEquiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-itunes-app" content="app-id=6771566491" />
<ScrollViewStyleReset />
</head>
<body>{children}</body>
</html>
);
}To make the website show the App Clip card instead of the install card, use:
<meta
name="apple-itunes-app"
content="app-id=6771566491, app-clip-bundle-id=com.bacon.may20.clip, app-clip-display=card"
/>The AASA file must be live before iOS will trust the association. Use EAS Hosting:
bunx expo export -p web
eas deploy --prodThis publishes the site (including /.well-known/apple-app-site-association) at https://<slug>.expo.app. Verify:
curl https://may20.expo.app/.well-known/apple-app-site-associationInspect the parent app's permissions after prebuild:
npx expo config --type introspectLook at the infoPlist object — mirror the permission keys in the App Clip's Info.plist so matching APIs can be used from the Clip.
Set deploymentTarget: "17.6" in the Clip's target config — App Clips have a higher minimum size limit in iOS 17.6.
If the app uses push notifications or location services, add to the App Clip's Info.plist to request the necessary permissions:
<key>NSAppClip</key>
<dict>
<key>NSAppClipRequestEphemeralUserNotification</key>
<false/>
<key>NSAppClipRequestLocationConfirmation</key>
<true/>
</dict>bunx testflightThis will:
eas.json if missing.Enabled: Associated Domains for the Clip target.Pull existing App Store metadata to local:
eas metadata:pullAdd apple.appClip to store.config.json. Up to 3 invocation URLs can launch the Clip from a web page:
{
"configVersion": 0,
"apple": {
"appClip": {
"defaultExperience": {
"action": "PLAY",
"releaseWithAppStoreVersion": true,
"reviewDetail": {
"invocationUrls": ["https://may20.expo.app/", null, null]
},
"info": {
"en-US": {
"subtitle": "Instantly native with Expo",
"headerImage": "store/apple/app-clip/en-US/asc-app-clip.png"
}
}
}
}
}
}The headerImage must be a 1800x1200 PNG with no opacity.
Push back to the store:
eas metadata:pushApple's recommended App Clip metadata guidelines: https://sosumi.ai/documentation/appclip/configuring-the-launch-experience-of-your-app-clip
com.bacon.may20com.bacon.may20.clip, lives in targets/clip/https://may20.expo.app/.well-known/apple-app-site-associationOnce Apple invokes the Clip from a URL on the domain, iOS opens targets/clip/'s entry point which loads the React Native app.
To let JS detect when it's running inside an App Clip and present an install prompt for the full app, create a local Expo module (bunx create-expo-module --local) that exposes navigator.appClip.prompt().
See ./references/native-module.md for the Swift module, TypeScript interface, and usage.
If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
npx --yes submit-expo-feedback@latest --category skills --subject "expo-app-clip" "<actionable feedback>"Only submit when you have something specific and actionable to report. Include as much relevant context as possible. If an AI agent repeatedly failed or the user had to take over an Expo task, load the expo-skill-feedback skill and follow its eval-candidate flow instead of reusing the command above.
© expo, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in plugins/expo/skills/expo-app-clip of expo/skills.
Open the folder on GitHubat commit d4f4840
We found 6 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 2 other GitHub owners. This page covers the copy in expo/skills, which our catalogue first saw on October 7, 2026.
Expo App Clip next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Expo App Clip this skillexpo/skills | 2.7k | 2 repos | ~2.4k | Automated safety check: Pass | MIT | |
| Expo Deploymentkingstinct/react-native-healthkit | 716 | 4 repos | ~930 | Automated safety check: Pass | MIT | |
| OdevioOdevio/Odevio-CLI | 423 | — | ~7.6k | Automated safety check: Pass | MIT | |
| Expo Dev Clientkingstinct/react-native-healthkit | 716 | 5 repos | ~879 | Automated safety check: Pass | MIT | |
| Iapkit E2E Martiehyodotdev/openiap | 155 | — | ~5.4k | Automated safety check: Notes | MIT | |
| Expo Deploymentsickn33/agentic-awesome-skills | 47k | 1 repos | ~1.2k | Automated safety check: Pass | MIT |
kingstinct/react-native-healthkit
Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes
Odevio/Odevio-CLI
Take a Flutter project to an iPhone or the App Store with Odevio - build, sign and publish iOS apps from Windows, Linux or macOS with no Mac and no Xcode.
kingstinct/react-native-healthkit
Build and distribute Expo development clients locally or via TestFlight
hyodotdev/openiap
Run IAPKit local receipt-validation E2E with the dev.hyo.martie React Native or Expo examples, the compiled packages/kit server, real Convex, and Apple or Google sandbox purchases.
sickn33/agentic-awesome-skills
Deploy Expo apps with EAS: build and submit iOS and Android releases, configure build and submit profiles, manage versions and store metadata, and deploy web bundles or API routes.
sickn33/agentic-awesome-skills
Build Expo app for development
expo/skills
Check the health of published EAS Update: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel.
expo/skills
Helps understand and write EAS workflow YAML files for Expo projects.
expo/skills
Evaluate Expo skills in this repo end-to-end - trigger accuracy, generated code quality, and runtime screenshots on iOS simulator and Android emulator via Expo Go (web optional).
expo/skills
Submit feedback on an Expo skill—or Expo itself—and control bundled anonymous usage telemetry (off by default / opt-in).
expo/skills
Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript).
expo/skills
Guidelines for upgrading Expo SDK versions and fixing dependency issues
Works with
Categories
Add an iOS App Clip target to an Expo app. An agent skill from expo/skills. Expo App Clip is an agent skill from expo/skills, published by the product's own GitHub organization. Add an iOS App Clip target to an Expo app.
Expo App Clip fits situations like: the user mentions App Clip; apple-app-site-association; smart app banner; wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.
Run `npx skills add expo/skills --skill expo-app-clip -a claude-code`. Or copy the skill folder (plugins/expo/skills/expo-app-clip in expo/skills) into .claude/skills/expo-app-clip in your project. Claude Code loads it when a task matches its description.
Run `npx skills add expo/skills --skill expo-app-clip -a codex`. Or copy the skill folder (plugins/expo/skills/expo-app-clip in expo/skills) into .agents/skills/expo-app-clip in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add expo/skills --skill expo-app-clip -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/expo-app-clip, .gemini/skills/expo-app-clip, .github/skills/expo-app-clip and .opencode/skills/expo-app-clip in your project.
Going by SKILL.md and its folder, Expo App Clip needs the command-line tools its instructions call (bunx, eas, bun, npx, curl and expo). Our summary lists: Node.js.
SKILL.md names 6 domains. In commands or code: may20.expo.app and github.com; the agent is likely to contact these when it follows the instructions. As links in the text: docs.expo.dev, sosumi.ai, expo.dev and developer.apple.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Expo App Clip is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 577 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Expo App Clip: Expo Deployment (kingstinct/react-native-healthkit, 716 stars), Odevio (Odevio/Odevio-CLI, 423 stars), Expo Dev Client (kingstinct/react-native-healthkit, 716 stars) and Iapkit E2E Martie (hyodotdev/openiap, 155 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
expo (a GitHub organization, an official publisher) maintains it in expo/skills, which has 2,685 GitHub stars. The repository holds 26 skills in this directory. The repository was last updated on October 7, 2026.
Source: expo/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.