Screenmap
aleqsio/screenmap
Generate a visual navigation map of an Expo / React Native or NativeScript app.
A skill your agent uses when shipping a React Native app with Expo — EAS Build/Submit/Update, eas.json profiles and channels, config plugins, prebuild/CNG, runtime-version policy, OTA updates that…
$ npx skills add ericrisco/rsc-harness --skill expo -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness expo --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/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/expo .claude/skills/expo && 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" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/expo into .claude/skills/expo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo", 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/ericrisco/rsc-harness/tree/main/skills/expoType 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 ericrisco/rsc-harness --skill expo -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness expo --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/expo .agents/skills/expo && 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" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/expo into .agents/skills/expo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo", 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 ericrisco/rsc-harness --skill expo -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness expo --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/expo .cursor/skills/expo && 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" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/expo into .cursor/skills/expo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo", 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/ericrisco/rsc-harness.git --path skills/expo--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 ericrisco/rsc-harness --skill expo -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness expo --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/expo .gemini/skills/expo && 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" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/expo into .gemini/skills/expo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo", 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 ericrisco/rsc-harness expoInstalls 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 ericrisco/rsc-harness --skill expo -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/expo .github/skills/expo && 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" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/expo into .github/skills/expo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo", 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 ericrisco/rsc-harness --skill expo -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ericrisco/rsc-harness expo --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/expo .opencode/skills/expo && 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" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/expo into .opencode/skills/expo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expo", 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.
expoA skill your agent uses when shipping a React Native app with Expo — EAS Build/Submit/Update, eas.json profiles and channels, config plugins, prebuild/CNG, runtime-version policy, OTA updates that…
Expo is an agent skill from ericrisco/rsc-harness. Use when shipping a React Native app with Expo — EAS Build/Submit/Update, eas.json profiles and channels, config plugins, prebuild/CNG, runtime-version policy, OTA updates that never land, SDK upgrades, the New Architecture. NOT RN UI, navigation or native-module authoring (that is react-native), NOT a Dart app (that is flutter).
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/config-plugins.md`).
It sits in Mobile, covering Cross-platform mobile apps. It works with Expo, React Native, Flutter and Dart. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit e3d5b33. 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.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
easnpxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.
From 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 loads about 2.9k tokens when it runs, and up to ~5.4k if it reads all its reference files. Until then it costs about 85 tokens; SKILL.md has 1,222 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 noted patterns worth knowing about, such as sudo or a known installer.
through **EAS environment variables** / `.env` filesAutomated 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); the scripts in this folder are not scanned.
The full file from ericrisco/rsc-harness at commit e3d5b33, republished under its MIT licence (© ericrisco). 1,222 words, ~2,859 tokens.
.claude/skills/expo/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Hand-off — the app vs its motion. This skill owns the Expo platform: router, config plugins, EAS,
native modules, store builds. Animation and gestures — Reanimated worklets, the UI runtime,
sheets, screen transitions, press feedback, haptics, motion that stutters on a real device — are
../motion-craft/SKILL.md's.
Expo is the toolchain and EAS cloud platform layered on React Native: cloud builds, store submission, over-the-air JS updates, and native configuration declared in JavaScript instead of hand-edited Xcode/Gradle projects. This skill owns the shipping pipeline and native-config-via-JS.
The verb rule of thumb: if the verb is build / submit / update / prebuild /
plugin / EAS / channel / runtime-version, you are in expo. If it is render /
navigate / animate / bridge / write a native module, route to react-native.
Other exits: web React/hooks/state → react, a Dart app → flutter, native-only
Swift/Kotlin → swift-ios/kotlin-android, a desktop wrapper → tauri/electron,
CI unrelated to EAS → github-actions.
Current stable as of 2026-06-02: Expo SDK 55 — React Native 0.83.1, React 19.2.0, shipped 2026-02-25. SDK 56 is in beta (beta opened 2026-05-06, ~2-week window; RN 0.85.2, React 19.2.3) — upcoming, not yet shipped stable. Both run exclusively on the New Architecture; the Legacy Architecture was removed in SDK 55.
| Situation | Do this | Why / not that |
|---|---|---|
| New app, want config-as-JS | managed + prebuild (CNG) — no committed ios//android/ | native dirs are regenerable artifacts; hand-edits get blown away |
| You truly need to hand-edit native code long-term | bare (commit ios//android/) | last resort; you lose prebuild --clean upgrades |
| Quick demo, only Expo-SDK modules | Expo Go | zero build, but custom native deps will crash |
| Any custom native dependency or plugin | dev build (developmentClient: true) | Expo Go cannot load arbitrary native code |
| Runtime version, picking a policy | fingerprint (auto-bumps on native change) | safest default; prevents serving JS to an incompatible binary |
| Runtime tied to your release version | appVersion | simpler, but you must remember to bump it on native changes |
Four EAS verbs, in this order: prebuild → build → submit → update.
npx expo prebuild --clean # regenerate native dirs from app config + plugins (CNG)
eas build -p ios --profile production # cloud-build the binary (.ipa/.aab)
eas submit -p ios --profile production # upload to App Store / Play Store
eas update --branch production --message "fix typo" # ship JS-only over the airprebuild is only needed for managed/CNG apps and runs automatically inside
eas build; run it locally to inspect or to verify a plugin. Build/submit ship a
new binary; update ships JS only — anything touching native code needs a new build.
Minimal eas.json with the three default profiles plus channels. Each build is
stamped with a channel; a channel maps to a same-named EAS Update branch by default
(SDK 55 stable builders: RN 0.83.1, Xcode 26 on iOS, Android 16 target):
{
"cli": { "version": ">= 16.0.0" },
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"channel": "development"
},
"preview": {
"distribution": "internal",
"channel": "preview"
},
"production": {
"channel": "production",
"autoIncrement": true
}
},
"submit": {
"production": {}
}
}Run scripts/verify.sh inside an Expo project to gate eas.json, the runtime
policy, committed secrets, and New-Arch readiness.
Runtime version is the compatibility gate. An update applies to a build only
when BOTH the platform AND the runtimeVersion match exactly — there is no
"close enough". The chain is: build stamped with a channel → channel points at a
branch → you publish updates to a branch. Updates flow only down a matching
runtime within the linked branch.
The #1 footgun: a hardcoded runtimeVersion that drifts from the binary, so the
update silently never installs and you stare at unchanged devices.
// BAD — hardcoded string in app.json; bump a native dep and every old build
// silently stops matching, so your "shipped" OTA never reaches users.
{ "expo": { "runtimeVersion": "1.0.0" } }// GOOD — fingerprint policy: EAS hashes the native runtime and auto-bumps the
// runtime version whenever native code/config changes, so updates only ever
// reach binaries that can actually run them.
{ "expo": { "runtimeVersion": { "policy": "fingerprint" } } }Inspect, branch ops, rollouts/rollbacks, republish, and the full "update not
applying" decision flow → references/eas-update.md.
Never hand-edit ios/ or android/ — they are ephemeral, regenerated by
npx expo prebuild --clean from app.config + plugins + autolinking. To change
native config, write a config plugin (a function in the plugins array) or use a
mod like withInfoPlist / withAndroidManifest.
// app.plugin.ts — add an iOS Info.plist key during prebuild, the CNG way.
import { ConfigPlugin, withInfoPlist } from "expo/config-plugins";
const withCameraUsage: ConfigPlugin<{ reason: string }> = (config, { reason }) =>
withInfoPlist(config, (cfg) => {
cfg.modResults.NSCameraUsageDescription = reason;
return cfg;
});
export default withCameraUsage;// app.config.ts — dynamic config; reference the plugin with its options.
export default {
expo: {
name: "MyApp",
runtimeVersion: { policy: "fingerprint" },
plugins: [["./app.plugin.ts", { reason: "Scan receipts" }]],
},
};Plugin anatomy, dangerous mods, mod ordering, and prebuild troubleshooting →
references/config-plugins.md.
The Legacy Architecture is gone. SDK 54 was the last release to ship it; SDK 55
(2026-02-25, current stable) removed it entirely, and the SDK 56 beta builds on that.
On any supported SDK you are already on the New Architecture — it is always
enabled and cannot be turned off. The newArchEnabled flag was deleted from
app.json in SDK 55; if you still carry one, it is dead config — remove it. There is no legacy
fallback to lean on, so a dependency that only works on the old architecture is now a
hard blocker, not a "flip the flag back" escape hatch.
Upgrade checklist:
npx expo install expo@latest --fix — bump SDK and align every dependency.npx expo-doctor@latest — catch deps that never made the New-Arch jump before you build.npx expo prebuild --clean — regenerate native dirs (managed/CNG apps).development/preview binary on a device before promoting to production.Two upgrade tripwires: every Android app is edge-to-edge (on since SDK 54, non-negotiable) — audit manual inset/status-bar code. And SDK 55+ ships Hermes bytecode diffing for EAS Update (~75% smaller OTA downloads) automatically; you get it for free once both the build and the update are on SDK 55+.
.env files
scoped by profile, not committed plaintext.*.jks/*.keystore), *.p12, or
*.mobileprovision, and never put API keys in app.config/app.json — anything
in app config ships inside the public bundle. See ../secure-coding/SKILL.md.EAS Workflows are Expo's own CI: YAML in .eas/workflows/. Jobs use pre-packaged
types (build, submit, update) and chain via needs: + outputs. Route to the
github-actions skill only when the user explicitly wants GH Actions or
non-Expo CI.
# .eas/workflows/release-android.yml — build then submit, chained by needs.
name: Release Android
on:
push:
branches: [main]
jobs:
build:
type: build
params:
platform: android
profile: production
submit:
needs: [build]
type: submit
params:
platform: android
build_id: ${{ needs.build.outputs.build_id }}EAS Free: 15 Android + 15 iOS builds/month on the low-priority queue only (peak waits can exceed an hour). High-priority queue needs a paid plan; the Production plan includes 2 build concurrencies, with extra concurrency at $50/concurrency/month, up to 5 extra. If a user complains about build queue waits, the fix is usually the plan, not the config. (Pricing per expo.dev/pricing, verified 2026-06-02; re-check before quoting — Expo adjusts tiers and dollar figures.)
| Anti-pattern | Do instead |
|---|---|
Editing ios/Info.plist directly | prebuild --clean overwrites it; write a config plugin / withInfoPlist. |
Hardcoding runtimeVersion: '1.0.0' because it is simpler | it drifts from the binary; updates silently stop matching. Use the fingerprint policy. |
| Expecting an OTA update to deliver a bumped native dep | EAS Update is JS-only; native changes need a new eas build. |
| Telling users to "just refresh" when a published update does not land | check the channel→branch and exact runtime match first — wrong channel = no delivery. |
| Testing a custom native module in Expo Go | Expo Go can't load arbitrary native code; build a dev client. |
| Upgrading the SDK and building straight to production | run expo-doctor + a preview build first; there is no Legacy-Arch fallback to catch a New-Arch-incompatible dep. |
Setting newArchEnabled: false to dodge a broken native dep | the flag was removed in SDK 55 and the Legacy Architecture is gone; fix or replace the dep. |
| Committing the keystore so CI can sign | never; let EAS manage credentials or use EAS secrets. |
Putting the API key in app.config extra | app config ships in the public bundle; use EAS env vars / a backend. |
Reaching for GitHub Actions to call eas build | EAS Workflows is the native CI; only reach for github-actions if explicitly required. |
In a project with a 02-DOCS/ layer (the harness wiki),
read 02-DOCS/wiki/stack/expo.md first and record this app's shipping decisions
there — managed-vs-bare, runtime-version policy, channel/branch map, SDK/New-Arch
status — linked from the root CLAUDE.md ## Knowledge map, bumping its Updated
date when a convention changes. No 02-DOCS/? Skip silently. Conventions are
recorded, not gated — never block the task on this.
© ericrisco, 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 5 other files (scripts, references) in skills/expo of ericrisco/rsc-harness.
Open the folder on GitHubat commit e3d5b33
Expo 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 this skillericrisco/rsc-harness | 167 | — | ~2.9k | Automated safety check: Notes | MIT | |
| Screenmapaleqsio/screenmap | 242 | — | ~7.2k | Automated safety check: Pass | MIT | |
| ThemingCode-with-Beto/skills | 141 | — | ~2.5k | Automated safety check: Pass | None | |
| Revyl CLI Auth BypassRevylAI/revyl-cli | 522 | — | ~2.5k | Automated safety check: Pass | None | |
| Fishjam React Native Clientsoftware-mansion-labs/skills | 291 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Oma Mobilefirst-fluke/oh-my-agent | 1.3k | — | ~1.6k | Automated safety check: Pass | MIT |
aleqsio/screenmap
Generate a visual navigation map of an Expo / React Native or NativeScript app.
Code-with-Beto/skills
Scaffold a unified, cross-platform color theme system into an Expo Router app.
RevylAI/revyl-cli
Set up test-only auth bypass for Revyl runs across Expo, React Native, native iOS, native Android, and Flutter apps.
software-mansion-labs/skills
React Native / Expo SDK for Fishjam — video/audio streaming on iOS and Android.
first-fluke/oh-my-agent
Mobile specialist for Flutter, React Native, and cross-platform mobile development.
ww-w-ai/bkit-claude-code
Mobile app development guide — React Native, Flutter, Expo for cross-platform.
ericrisco/rsc-harness
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
ericrisco/rsc-harness
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
ericrisco/rsc-harness
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
ericrisco/rsc-harness
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
ericrisco/rsc-harness
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
ericrisco/rsc-harness
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
Categories
A skill your agent uses when shipping a React Native app with Expo — EAS Build/Submit/Update, eas.json profiles and channels, config plugins, prebuild/CNG, runtime-version policy, OTA updates that…. Expo is an agent skill from ericrisco/rsc-harness.json profiles and channels, config plugins, prebuild/CNG, runtime-version policy, OTA updates that never land, SDK upgrades, the New Architecture.
Expo fits situations like: shipping a React Native app with Expo — EAS Build/Submit/Update; eas.json profiles and channels; runtime-version policy; OTA updates that never land.
Run `npx skills add ericrisco/rsc-harness --skill expo -a claude-code`. Or copy the skill folder (skills/expo in ericrisco/rsc-harness) into .claude/skills/expo in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill expo -a codex`. Or copy the skill folder (skills/expo in ericrisco/rsc-harness) into .agents/skills/expo 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 ericrisco/rsc-harness --skill expo -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, .gemini/skills/expo, .github/skills/expo and .opencode/skills/expo in your project.
Going by SKILL.md and its folder, Expo needs a shell for the scripts in its folder and the command-line tools its instructions call (eas and npx). Our summary lists: Node.js; A Bash shell.
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Expo 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.9k tokens (SKILL.md is roughly 11k 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 2.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Expo: Screenmap (aleqsio/screenmap, 242 stars), Theming (Code-with-Beto/skills, 141 stars), Revyl CLI Auth Bypass (RevylAI/revyl-cli, 522 stars) and Fishjam React Native Client (software-mansion-labs/skills, 291 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 167 GitHub stars. The repository holds 227 skills in this directory. The repository was last updated on October 7, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.