Data Client Setup
reactive/data-client
Install and set up @data-client/react or @data-client/vue in a project.
A skill your agent uses when writing the JS/TS inside a React Native or Expo app — screens, Expo Router navigation, lists, Reanimated gestures, platform forks, offline state, native modules — or…
$ npx skills add ericrisco/rsc-harness --skill react-native -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness react-native --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/react-native .claude/skills/react-native && 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 "react-native" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/react-native into .claude/skills/react-native/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-native", 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/react-nativeType 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 react-native -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness react-native --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/react-native .agents/skills/react-native && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "react-native" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/react-native into .agents/skills/react-native/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-native", 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 react-native -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness react-native --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/react-native .cursor/skills/react-native && 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 "react-native" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/react-native into .cursor/skills/react-native/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-native", 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/react-native--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 react-native -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness react-native --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/react-native .gemini/skills/react-native && 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 "react-native" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/react-native into .gemini/skills/react-native/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-native", 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 react-nativeInstalls 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 react-native -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/react-native .github/skills/react-native && 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 "react-native" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/react-native into .github/skills/react-native/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-native", 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 react-native -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 react-native --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/react-native .opencode/skills/react-native && 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 "react-native" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/react-native into .opencode/skills/react-native/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-native", 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.
react-nativeA skill your agent uses when writing the JS/TS inside a React Native or Expo app — screens, Expo Router navigation, lists, Reanimated gestures, platform forks, offline state, native modules — or…
React Native is an agent skill from ericrisco/rsc-harness. Use when writing the JS/TS inside a React Native or Expo app — screens, Expo Router navigation, lists, Reanimated gestures, platform forks, offline state, native modules — or killing jank and render storms. NOT eas build/submit/OTA/config-plugin (that is expo), NOT a Dart app (that is flutter), NOT web React/DOM (that is react or nextjs).
Its SKILL.md is about 3k 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/native-modules.md`).
It sits in Mobile, covering Cross-platform mobile apps. It works with Expo, React Native, React and Flutter. 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.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 92fde8f. 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.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
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.
React Native loads about 3k tokens when it runs, and up to ~5k if it reads all its reference files. Until then it costs about 90 tokens; SKILL.md has 1,242 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); the scripts in this folder are not scanned.
The full file from ericrisco/rsc-harness at commit 92fde8f, republished under its MIT licence (© ericrisco). 1,242 words, ~2,991 tokens.
.claude/skills/react-native/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. Animation and gestures in a React Native app — Reanimated
worklets on the UI runtime, gesture handoff, sheets, press feedback, haptics — are
../motion-craft/SKILL.md's, whose guidance is platform-agnostic and applies to bare React Native as well as Expo.
You write the code that runs inside the app: render, navigate, animate, list, persist, and author native modules. Mobile is split across two skills by verb — run the verb test before doing anything:
| Verb in the request | Skill |
|---|---|
| render / navigate / animate / list / persist / author-native-module / debug-runtime | react-native (here) |
build / submit / update (OTA) / prebuild / config-plugin / eas.json / channel / runtime-version | ../expo/SKILL.md |
Assume the New Architecture is on (Fabric + Turbo Modules). It is mandatory from RN 0.82 / Expo SDK 55 — RN 0.82 (2025-10-08) ignores any disable flag, and SDK 55 is New-Arch-only. SDK 54 (RN 0.81) was the last that could opt out. Never write newArchEnabled: false to dodge a bug; fix the bug. Why: the flag is a no-op on current versions, so the "fix" silently does nothing.
Reference SDK→RN map (accessed 2026-06-02): SDK 53 = RN 0.79, SDK 54 = RN 0.81 (React Compiler GA), SDK 55 = RN 0.83.
This is the one real branch at scaffold time:
| Use | When |
|---|---|
| Expo Router (file-based) | New apps, web parity, deep links, typed routes. The recommended default. It is a layer on top of React Navigation; both are Expo-team maintained. |
| React Navigation v7 (static API) | Brownfield apps, native integration, highly bespoke custom transitions where you need imperative control. |
Default file tree for an Expo Router app:
app/ # routes — file system IS the navigation
(auth)/ # group: unauthenticated screens
(app)/ # group: authenticated screens
(tabs)/ # nested tab navigator
_layout.tsx # root layout + providers
components/ # dumb, reusable UI
features/<domain>/ # feature-scoped screens, hooks, components
lib/ # clients, query setup, storage, utilsKeep route files thin: a route file wires params and renders a feature component. Put logic in features/. Why: routes get re-mounted by navigation; business logic in them is hard to test and re-runs unexpectedly.
Type your routes. With Expo Router, enable typed routes and let useLocalSearchParams<{ id: string }>() carry the contract. Why: deep links and back-stack restoration pass strings you will otherwise misread.
Gate auth at the group layout, declaratively — not imperatively inside an effect:
// app/(app)/_layout.tsx — Bad: imperative nav in an effect races the first paint
export default function AppLayout() {
const { user } = useAuth();
useEffect(() => {
if (!user) router.replace('/(auth)/sign-in'); // flashes protected UI first
}, [user]);
return <Stack />;
}// app/(app)/_layout.tsx — Good: redirect before children mount
import { Redirect, Stack } from 'expo-router';
export default function AppLayout() {
const { user, loading } = useAuth();
if (loading) return null; // or a splash
if (!user) return <Redirect href="/(auth)/sign-in" />;
return <Stack />;
}Modals/sheets: declare presentation on the screen, not by pushing a styled full-screen route — <Stack.Screen options={{ presentation: 'modal' }} />. Configure deep links via the scheme + the linking config so a cold-start link resolves to the right nested route, not just the root. A deep link landing on the wrong screen is almost always a group/segment mismatch between the URL and the app/ tree.
Switch from FlatList to FlashList (Shopify) once a list crosses ~100 items, has variable row heights, or renders images. Why: FlashList recycles views instead of mounting one per row, so memory and scroll jank stay flat as the list grows.
Three things every long list needs:
keyExtractor — return a real id, never the index. Index keys defeat recycling and reorder rows on insert.getItemType when rows differ structurally (header vs product vs ad). Why: it lets FlashList recycle within a type instead of remeasuring.renderItem.// Bad: new fn + new style object every parent render -> every visible row re-renders
<FlashList
data={items}
renderItem={({ item }) => (
<Pressable style={{ padding: 12 }} onPress={() => open(item.id)}>
<Text>{item.title}</Text>
</Pressable>
)}
/>// Good: stable refs, memoized row, typed rows
const Row = memo(function Row({ item }: { item: Product }) {
const open = useOpenProduct(); // stable from context/store
return (
<Pressable style={styles.row} onPress={() => open(item.id)}>
<Text>{item.title}</Text>
</Pressable>
);
});
<FlashList
data={items}
keyExtractor={(it) => it.id}
getItemType={(it) => it.kind}
renderItem={({ item }) => <Row item={item} />}
/>FlashList caveat: rows can flash into the wrong position for a split second if mounted while entry animations run. Disable entry animations on the initial mount.
React Compiler (GA in SDK 54) auto-memoizes components and reduces manual useMemo/useCallback — but it does not remove the need for virtualization, stable keys, or getItemType. Don't delete your list discipline because the compiler is on. For re-render hunting and profiling, see references/performance-debugging.md.
Reanimated worklets run on the UI thread, so animations keep going at 60fps even when JS is busy. Reanimated 4 (stable Oct 2025) requires the New Architecture / RN 0.76+ and adds CSS-style animations while keeping the worklet API. Many teams stay on Reanimated 3 for dependency compatibility — match the project's installed major.
Two rules that fix most gesture bugs:
useMemo. Why: a new gesture object each render reattaches the recognizer and drops in-flight touches.runOnJS. Why: calling a JS-thread function directly from a worklet crashes; everything inside the worklet must stay on the UI thread.// Good: memoized gesture, UI-thread shared value, JS only at the end
const x = useSharedValue(0);
const pan = useMemo(
() =>
Gesture.Pan()
.onUpdate((e) => { x.value = e.translationX; }) // UI thread
.onEnd(() => { runOnJS(onSwiped)(); x.value = withSpring(0); }), // boundary
[onSwiped],
);Use Reanimated 4 CSS animations for simple declarative cases (fades, simple transitions); use worklets for gesture-driven or physics-based motion. Never animate layout on the JS thread when a shared value will do it on the UI thread.
Platform.select({ ios: 12, android: 8 }) or Platform.OS === 'ios'.Button.ios.tsx / Button.android.tsx — the bundler picks the right one; import ./Button with no extension.react-native-safe-area-context insets, not hardcoded notch padding. Why: insets differ per device and orientation. Palette, type scale and layout intent are not decided here → ../design/SKILL.md.KeyboardAvoidingView behaves differently per platform — padding on iOS, often height or nothing on Android; test both, don't assume the iOS behavior ports.expo-status-bar.| Path | When | Cost |
|---|---|---|
| Plain JS wrapper of an existing lib | A maintained npm package already bridges the native API | None — do this first |
| Expo Modules API (Swift/Kotlin) | App uses Expo; you want clean Swift/Kotlin, no codegen | Requires Expo; least boilerplate |
| Turbo Module (codegen from TS specs) | Bare RN, or you need the RN-default path | Codegen specs + more boilerplate |
| Nitro Modules | Hot path needing max throughput | Emerging; weigh maturity |
Minimal Expo Module skeleton (definition lives in the module's Swift/Kotlin):
// ios/MyModule.swift
import ExpoModulesCore
public class MyModule: Module {
public func definition() -> ModuleDefinition {
Name("MyModule")
Function("hello") { (name: String) -> String in "Hi \(name)" }
}
}// index.ts — typed JS surface
import { requireNativeModule } from 'expo-modules-core';
const MyModule = requireNativeModule('MyModule');
export function hello(name: string): string { return MyModule.hello(name); }Full Expo Module (Swift + Kotlin + view), the Turbo Module codegen-spec walkthrough, packaging, and autolinking → references/native-modules.md.
references/performance-debugging.md before guessing.../debug/SKILL.md.| Anti-pattern | Why it hurts | Do instead |
|---|---|---|
FlatList for 5k rows / image feeds | Mounts a view per row; jank + memory blowup | FlashList with getItemType + stable keyExtractor |
Inline arrow / style object in renderItem | New ref every render re-renders every visible row | Memoized Row, StyleSheet.create, stable handlers |
| Gesture object built inline each render | Reattaches recognizer, drops in-flight touches | Wrap in useMemo keyed on real deps |
setState in render path | Render loop / re-render storm on every keystroke | Derive in render or move to an event handler |
Imperative router.replace in an effect to gate auth | Flashes protected UI, races first paint | <Redirect> at the group layout |
newArchEnabled: false to dodge a New-Arch bug | No-op on RN 0.82+/SDK 55; hides the real cause | Update the offending lib; fix the bug |
| Animating layout on the JS thread | Drops frames when JS is busy | Reanimated shared value on the UI thread |
| Index as list key | Breaks recycling, reorders rows on insert | Stable domain id |
Doing native config / eas.json / OTA here | Wrong skill; this is app code | ../expo/SKILL.md |
| Hardcoded notch/safe-area padding | Wrong on other devices/orientations | react-native-safe-area-context insets |
© 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/react-native of ericrisco/rsc-harness.
Open the folder on GitHubat commit 92fde8f
React Native 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 |
|---|---|---|---|---|---|---|
| React Native this skillericrisco/rsc-harness | 156 | — | ~3k | Automated safety check: Pass | MIT | |
| Data Client Setupreactive/data-client | 2k | — | ~2.2k | Automated safety check: Pass | Apache-2.0 | |
| Expo Web To Nativeexpo/skills | 2.7k | — | ~2.6k | Automated safety check: Pass | MIT | |
| Cometchat Migrate From Getstreamcometchat/cometchat-skills | 129 | — | ~5.4k | Automated safety check: Notes | MIT | |
| Cometchat Migrate From Sendbirdcometchat/cometchat-skills | 129 | — | ~5.2k | Automated safety check: Notes | MIT | |
| Olore Rive Latestolorehq/olore | 103 | — | ~465 | Automated safety check: Pass | MIT |
reactive/data-client
Install and set up @data-client/react or @data-client/vue in a project.
expo/skills
Migrate an existing web React app to a native iOS/Android app with Expo.
cometchat/cometchat-skills
Migrate an app from Stream (GetStream) Chat to CometChat end-to-end in ONE prompt, on any platform in this pack (React, Angular, React Native/Expo, iOS, Android, Flutter).
cometchat/cometchat-skills
Migrate an app from Sendbird to CometChat end-to-end in ONE prompt, on any platform in this pack (React, Angular, React Native/Expo, iOS, Android, Flutter).
olorehq/olore
Local Rive documentation reference (latest). An agent skill from olorehq/olore.
avibebuilder/claude-prime
Builds distinctive, production-grade UIs that avoid generic AI aesthetics.
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 writing the JS/TS inside a React Native or Expo app — screens, Expo Router navigation, lists, Reanimated gestures, platform forks, offline state, native modules — or…. React Native is an agent skill from ericrisco/rsc-harness. Use when writing the JS/TS inside a React Native or Expo app — screens, Expo Router navigation, lists, Reanimated gestures, platform forks, offline state, native modules — or killing jank and render storms.
React Native fits situations like: writing the JS/TS inside a React Native; expo app — screens; expo Router navigation; reanimated gestures.
Run `npx skills add ericrisco/rsc-harness --skill react-native -a claude-code`. Or copy the skill folder (skills/react-native in ericrisco/rsc-harness) into .claude/skills/react-native in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill react-native -a codex`. Or copy the skill folder (skills/react-native in ericrisco/rsc-harness) into .agents/skills/react-native 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 react-native -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/react-native, .gemini/skills/react-native, .github/skills/react-native and .opencode/skills/react-native in your project.
Going by SKILL.md and its folder, React Native needs a shell for the scripts in its folder. Our summary lists: A Bash shell.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
React Native is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k 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 2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with React Native: Data Client Setup (reactive/data-client, 2k stars), Expo Web To Native (expo/skills, 2.7k stars), Cometchat Migrate From Getstream (cometchat/cometchat-skills, 129 stars) and Cometchat Migrate From Sendbird (cometchat/cometchat-skills, 129 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 156 GitHub stars. The repository holds 229 skills in this directory. The repository was last updated on October 6, 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.