Official agent skill

Expo App Clip

by expo in expo/skills

Add an iOS App Clip target to an Expo app. An agent skill from expo/skills.

OfficialMITAuto-check passedMobile

Install Expo App Clip

skills CLI
$ npx skills add expo/skills --skill expo-app-clip -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install expo/skills expo-app-clip --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
expo-app-clip
GitHub stars
2.7k
Used in
2 other repos
Token cost
~2.4k tokens
SKILL.md length
879 words
Files
3 (incl. references)
Skills in repo
26
Repo updated
First seen
Licence
MIT

At a glance

Add an iOS App Clip target to an Expo app. An agent skill from expo/skills.

  • Works in 10 steps: Set bundleIdentifier and appleTeamId → Add the App Clip target → Wire up associated domains → …
  • The user mentions App Clip
  • SKILL.md covers 1. Set bundleIdentifier and…, 2. Add the App Clip target, 3. Wire up associated domains and 4. Register bundle IDs and…, plus 10 more sections
  • Calls bunx, eas and bun; reaches may20.expo.app and github.com

What it does

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.

When your agent uses it

  • 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

Example prompts

  • “/expo-app-clip”

Requirements

  • Node.js

Workflow steps

10 steps, taken from the step headings in SKILL.md.

  1. Set bundleIdentifier and appleTeamId
  2. Add the App Clip target
  3. Wire up associated domains
  4. Register bundle IDs and create the App Store entry
  5. Host the AASA file
  6. Add the Smart App Banner meta tag
  7. Deploy the website
  8. Mirror permissions
  9. Build and submit to TestFlight
  10. Configure App Clip metadata

What it can do on your machine

Read from SKILL.md and the folder at commit d4f4840. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • bunx
    • eas
    • bun
    • npx
    • curl
    • expo

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • may20.expo.app
    • github.com

    Also links to:

    • docs.expo.dev
    • sosumi.ai
    • expo.dev
    • developer.apple.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~61
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~3k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from expo/skills at commit d4f4840, republished under its MIT licence (© expo). 879 words, ~2,397 tokens.

Download SKILL.mdSave it as .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.
name
expo-app-clip
description
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.

Add an App Clip to an Expo App

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 testflight uses 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).

1. Set bundleIdentifier and appleTeamId

bun create target warns if these are missing. Add to app.json:

json
{
  "expo": {
    "ios": {
      "bundleIdentifier": "com.<username>.<app-name>",
      "appleTeamId": "XX57RJ5UTD"
    }
  }
}

2. Add the App Clip target

sh
bun create target clip

This 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 plugin
  • targets/clip/Info.plist — Clip Info.plist
  • targets/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.

3. Wire up associated domains

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:

json
{
  "expo": {
    "ios": {
      "associatedDomains": [
        "applinks:may20.expo.app",
        "appclips:may20.expo.app"
      ]
    }
  }
}

In targets/clip/expo-target.config.js, declare the Clip's entitlement:

js
/** @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 prebuild will print: Apple App Clip may require the associated domains entitlement but none were found.

4. Register bundle IDs and create the App Store entry

sh
bunx setup-safari

This logs in to the Apple Developer account, registers com.bacon.may20, creates the App Store Connect entry, and prints:

  • A starter apple-app-site-association JSON
  • A <meta name="apple-itunes-app"> tag with the iTunes app id
  • Team ID, iTunes ID, and Bundle ID

5. Host the AASA file

App Clips are invoked when iOS fetches https://<your-domain>/.well-known/apple-app-site-association and finds a matching appclips entry.

sh
mkdir -p public/.well-known
touch public/.well-known/apple-app-site-association

Paste 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:

json
{
  "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:

  • The file has no extension and no Content-Type requirements beyond being served as-is. Expo Router static export serves files in public/ verbatim.
  • The 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/
  • Notation and route-disabling details: https://sosumi.ai/documentation/xcode/supporting-associated-domains

6. Add the Smart App Banner meta tag

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:

sh
bunx expo customize src/app/+html.tsx

Add the meta tag to the <head>:

tsx
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:

html
<meta
  name="apple-itunes-app"
  content="app-id=6771566491, app-clip-bundle-id=com.bacon.may20.clip, app-clip-display=card"
/>

7. Deploy the website

The AASA file must be live before iOS will trust the association. Use EAS Hosting:

sh
bunx expo export -p web
eas deploy --prod

This publishes the site (including /.well-known/apple-app-site-association) at https://<slug>.expo.app. Verify:

sh
curl https://may20.expo.app/.well-known/apple-app-site-association
Show full SKILL.md (372 more words)Show less

8. Mirror permissions

Inspect the parent app's permissions after prebuild:

sh
npx expo config --type introspect

Look 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:

xml
<key>NSAppClip</key>
<dict>
  <key>NSAppClipRequestEphemeralUserNotification</key>
  <false/>
  <key>NSAppClipRequestLocationConfirmation</key>
  <true/>
</dict>

9. Build and submit to TestFlight

sh
bunx testflight

This will:

  1. Generate an eas.json if missing.
  2. Set up credentials for both targets (parent + Clip). Each gets its own provisioning profile but can share a single Distribution Certificate.
  3. Sync capabilities — note Enabled: Associated Domains for the Clip target.
  4. Build, upload, and schedule a TestFlight submission.

10. Configure App Clip metadata

Pull existing App Store metadata to local:

sh
eas metadata:pull

Add apple.appClip to store.config.json. Up to 3 invocation URLs can launch the Clip from a web page:

json
{
  "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:

sh
eas metadata:push

Apple's recommended App Clip metadata guidelines: https://sosumi.ai/documentation/appclip/configuring-the-launch-experience-of-your-app-clip

What you get

  • Parent app target: com.bacon.may20
  • App Clip target: com.bacon.may20.clip, lives in targets/clip/
  • AASA hosted at https://may20.expo.app/.well-known/apple-app-site-association
  • Smart App Banner meta tag on every web route
  • Every route linked to its native counterpart
  • TestFlight build of the parent app with the Clip embedded

Once Apple invokes the Clip from a URL on the domain, iOS opens targets/clip/'s entry point which loads the React Native app.

Native detection (optional)

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.

References

  • ./references/native-module.md — Local Expo module to detect App Clip context and present the SKOverlay install prompt

Submitting Feedback

If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:

bash
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

Files

SKILL.md and 2 other files (references) in plugins/expo/skills/expo-app-clip of expo/skills.

  • SKILL.md
  • agents/openai.yaml
  • references/native-module.md

Open the folder on GitHubat commit d4f4840

Used in 2 other repositories

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.

Compare with similar skills

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.

Expo App Clip compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Expo App Clip this skillexpo/skills2.7k2 repos~2.4kAutomated safety check: PassMIT
Expo Deploymentkingstinct/react-native-healthkit7164 repos~930Automated safety check: PassMIT
OdevioOdevio/Odevio-CLI423—~7.6kAutomated safety check: PassMIT
Expo Dev Clientkingstinct/react-native-healthkit7165 repos~879Automated safety check: PassMIT
Iapkit E2E Martiehyodotdev/openiap155—~5.4kAutomated safety check: NotesMIT
Expo Deploymentsickn33/agentic-awesome-skills47k1 repos~1.2kAutomated safety check: PassMIT

Similar skills

  • Expo Deployment

    kingstinct/react-native-healthkit

    Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes

    716 GitHub starsUsed in 4 repos~930 tokens
    MobileAuto-check passed
  • Odevio

    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.

    423 GitHub stars~7.6k tokensUpdated 16 days ago
    MobileAuto-check passed
  • Expo Dev Client

    kingstinct/react-native-healthkit

    Build and distribute Expo development clients locally or via TestFlight

    716 GitHub starsUsed in 5 repos~879 tokens
    MobileAuto-check passed
  • Iapkit E2E Martie

    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.

    155 GitHub stars~5.4k tokensUpdated today
    MobileAuto-check: notes
  • Expo Deployment

    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.

    47k GitHub starsUsed in 1 repo~1.2k tokens
    MobileAuto-check passed
  • Expo Dev Client

    sickn33/agentic-awesome-skills

    Build Expo app for development

    47k GitHub starsUsed in 1 repo~1.1k tokens
    MobileAuto-check passed

More from expo/skills

All 26 skills in this repo
  • Official

    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.

    2.7k GitHub starsUsed in 4 repos~3.1k tokens
    Auto-check passed
  • Eas Workflows

    expo/skills

    Official

    Helps understand and write EAS workflow YAML files for Expo projects.

    2.7k GitHub stars~1.2k tokensUpdated 3 days ago
    Auto-check passed
  • Expo Skill Eval

    expo/skills

    Official

    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).

    2.7k GitHub stars~12k tokensUpdated 3 days ago
    Auto-check passed
  • Official

    Submit feedback on an Expo skill—or Expo itself—and control bundled anonymous usage telemetry (off by default / opt-in).

    2.7k GitHub stars~1.3k tokensUpdated 3 days ago
    Auto-check passed
  • Expo Module

    expo/skills

    Official

    Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript).

    2.7k GitHub starsUsed in 1 repo~1.6k tokens
    Auto-check passed
  • Expo Upgrade

    expo/skills

    Official

    Guidelines for upgrading Expo SDK versions and fixing dependency issues

    2.7k GitHub starsUsed in 9 repos~1.9k tokens
    Auto-check passed

Categories

Questions about Expo App Clip

What does Expo App Clip do?

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.

When should I use Expo App Clip?

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.

How do I install Expo App Clip in Claude Code?

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.

How do I install Expo App Clip in Codex?

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.

Can I use Expo App Clip in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Expo App Clip need to run?

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.

Does Expo App Clip access the network?

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.

Is Expo App Clip safe to install?

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.

What licence does Expo App Clip use?

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.

How many tokens does Expo App Clip use?

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.

What are the alternatives to Expo App Clip?

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.

Who maintains Expo App Clip?

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.