Kipt

Expo module skill: build native Expo modules with your agent

Expo's official expo-module skill teaches your coding agent to scaffold and write native modules and views in Swift, Kotlin and TypeScript. Install and use it.

By the Kipt team · Updated 24 October 2026

Source: expo/skills · Maintainer: Expo · License: MIT · Checked: 24 October 2026

What is the expo-module skill?

The expo-module skill is Expo's official Agent Skill for building native modules and native views with the Expo Modules API. It teaches your coding agent to scaffold a module with create-expo-module, write the Swift, Kotlin and TypeScript sides, wire up expo-module.config.json, and add config plugins and lifecycle hooks. Install it with npx skills add https://github.com/expo/skills --skill expo-module.

Its description opens: "Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript)." It sits in the Framework (open source) group of expo/skills, the free skills that don't depend on paid Expo Application Services.

As of 24 October 2026, its skills.sh page listed 44.8K installs (snapshot, 24 October 2026), second among Expo's current skills after expo-dev-client. skills.sh first saw it on 2 April 2026.

What does it do?

The skill is model-invoked: the agent loads it when you ask for native functionality in an Expo app. The SKILL.md (version 1.0.0) lists when it applies:

  • Creating a new Expo native module or native view
  • Adding native functionality such as camera, sensors or system APIs
  • Wrapping platform SDKs for use from React Native
  • Building config plugins that change native project files
  • Adding Android, Apple or web support to an existing module
  • Editing expo-module.config.json, config plugins or lifecycle hooks

Scaffold first. The core rule: "Prefer create-expo-module over manually creating native module files and directories." The scaffold sets up the folder layout, expo-module.config.json, podspec or Gradle files, TypeScript bindings and the example app. If a module only needs another platform, the agent runs create-expo-module add-platform-support instead of copying native folders.

A five-step workflow.

  1. Choose a local module (one app) or a standalone module (reuse, monorepos, publishing).
  2. Decide which features the module needs: Constant, Function, AsyncFunction, Event, View, ViewEvent or SharedObject.
  3. Scaffold with an explicit slug or path, an intentional --platform choice and --features for code samples.
  4. Replace the generated example code with the real implementation.
  5. Use add-platform-support when adding a platform later.

Scaffolding quirks. The skill records details that trip agents up. Feature samples are opt-in, so a module can start minimal. ViewEvent implies View. Local modules don't get an index.ts barrel unless you pass --barrel. In non-interactive mode, --name changes the native class name, not the folder name, and the reference file warns that leaving out the slug makes the CLI fall back to my-module.

Module shape. It shows the same small module in three languages: a Swift Module subclass with a definition() that declares Name and a Function, the Kotlin equivalent, and a TypeScript wrapper that calls requireNativeModule from expo. It also shows a minimal expo-module.config.json and notes that "iOS uses just the class name; Android uses the fully-qualified class name (package + class)."

Reference files. Six files in references/ load only when needed:

File Covers
create-expo-module.md Scaffolding, CLI flags, local vs standalone, add-platform-support
native-module.md The definition DSL: Name, Function, AsyncFunction, Property, Constant, events, types, shared objects
native-view.md Native view components, props, event dispatchers, view lifecycle
lifecycle.md Module, iOS AppDelegate and Android activity and application listeners
config-plugin.md Changing Info.plist and AndroidManifest.xml, reading values in native code
module-config.md expo-module.config.json fields and autolinking

The folder also has an agents/openai.yaml that gives Codex a display name and default prompt.

How do you install it?

Expo's README recommends the plugin for Claude Code and Codex, and the skills CLI for other agents. The Expo skills docs cover the same routes.

Claude Code plugin (all Expo skills plus the Expo MCP server).

claude plugin install expo@claude-plugins-official

You can also run /plugin install expo@claude-plugins-official inside Claude Code. The plugin comes from Anthropic's official plugin marketplace; see Claude Code plugins.

Codex plugin.

codex plugin add expo@openai-curated

Just this skill, with the skills CLI. The command on skills.sh:

npx skills add https://github.com/expo/skills --skill expo-module

Installed with the skills CLI, it lands in .claude/skills/expo-module/ for Claude Code, or ~/.claude/skills/expo-module/ with -g, the standard Claude Code skill locations. Codex and Cursor read the same SKILL.md format; see Codex skills and Cursor skills. To update it later, the README's single-skill update command takes the skill name: npx skills@latest update expo-module.

How do you use it?

Describe the native capability you need and where it should live. The skill fills in the scaffolding choices.

Example prompts (suggestions, not quotes from the repo):

  • Create a local Expo module that reads the device's battery temperature on iOS and Android and exposes it as an async function.
  • Wrap this Android SDK in an Expo module so I can call it from TypeScript. Scaffold it first, then implement.
  • Turn this local module into a standalone package I can publish to npm, with an example app.
  • Add web support to our existing Expo module without copying native folders by hand.
  • Write a config plugin that adds a camera usage description to Info.plist and a permission to AndroidManifest.xml.

Expo's Modules API overview and Module API reference are the source of truth the skill builds on; the README says Expo docs, Expo CLI and EAS CLI "remain the source of truth".

Tips and limits

From the SKILL.md, its references and skills.sh, not from testing:

  • You still need native toolchains. Building and running a module needs the iOS and Android build tools that native code always needs. The skill covers how to write the module, not your machine setup.
  • Pair it with expo-dev-client. Expo's skills list local Expo modules among the cases that need a custom build instead of Expo Go. The Expo skill (expo-dev-client) covers that step.
  • Not for API 2.0 macro migrations. Moving a Swift module from the definition DSL to the Expo Modules API 2.0 macros (@ExpoModule, @JS, @Event) is handled by expo-migrate-module, which is in the separate expo-experiments plugin.
  • Extra frontmatter field. The SKILL.md includes a version field, which is not one of the six fields (name, description, license, compatibility, metadata, allowed-tools) the Claude Code skills docs list for claude.ai skill uploads. The docs say an upload with any other field fails with an error, so remove that line before uploading it there.
  • Feedback command. The skill tells the agent it can send feedback to Expo with npx --yes @expo/agent-cli@latest feedback, only when it has something specific to report, and to file a brief --category evals report if an agent repeatedly fails at an Expo task. Watch for it if you don't want anything sent.
  • Audits. On 24 October 2026, skills.sh showed Pass from Gen Agent Trust Hub, Socket and Snyk, all three audits dated 22 October 2026. Snyk rated it low risk with "No issues detected."
  • License. MIT, stated in the SKILL.md frontmatter and in the LICENSE files at the repo root and in plugins/expo. Copy and change it, keeping the copyright notice.

Save it in your Kipt library

In Kipt, open Skills and paste the skill's GitHub folder link into the import box; it reads the SKILL.md, the six references/ files and agents/openai.yaml. Paste the repo link instead and Kipt shows a list of Expo skills to pick from, so you can add expo-dev-client in the same pass. Your library stays in a private GitHub repo you own and installs into Claude Code or Codex with one command:

npx skills add https://github.com/<you>/<repo>.git --all -g

Kipt is not affiliated with Expo.

Similar skills

Questions

What is the expo-module skill?

expo-module is an official Agent Skill from Expo in the expo/skills repo. It guides a coding agent through creating and writing Expo native modules and native views with the Expo Modules API in Swift, Kotlin and TypeScript, including config plugins, lifecycle hooks and autolinking. It is MIT licensed.

How do I install the expo-module skill?

For Claude Code, Expo recommends the plugin: claude plugin install expo@claude-plugins-official, which installs every Expo skill and the Expo MCP server. For Codex, run codex plugin add expo@openai-curated. For this skill only, run npx skills add https://github.com/expo/skills --skill expo-module.

Does the skill write modules by hand or use a scaffold?

It tells the agent to prefer create-expo-module over creating native files and folders by hand. The agent picks a local or standalone module, chooses platforms and feature samples with flags, then replaces the generated example code with the real implementation.

What is the difference between a local and a standalone Expo module?

Per the skill, a local module belongs to one app, lives in the modules folder (or the folder set in expo.autolinking.nativeModulesDir) and uses the app's tooling. A standalone module has its own package.json and usually an example app, and suits reuse, monorepos or publishing to npm.

Can the expo-module skill migrate a module to the Expo Modules API 2.0 macros?

No. Its description says that migration belongs to a separate skill, expo-migrate-module, which ships in the expo-experiments plugin. expo-module covers the definition DSL with Name, Function, AsyncFunction, Property, Constant, Events, views and shared objects.

More in Skill directory

All guides

Keep your prompts and skills in one place, in your own GitHub. Install every skill with one command.

Get started

Kipt is an independent product, not affiliated with or endorsed by Anthropic, OpenAI, Cursor or GitHub. Claude, ChatGPT, Codex, Cursor and GitHub are trademarks of their owners.