React Native Mmkv
margelo/react-native-skills
Fast synchronous key-value storage for React Native via react-native-mmkv (Nitro-backed).
Build production React Native apps with Expo SDK 53+, Expo Router (file-based navigation), New Architecture (Fabric + TurboModules), FlashList, Reanimated 4, Zustand for state, Hermes, EAS Build…
$ npx skills add EliasOulkadi/shokunin --skill react-native -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install EliasOulkadi/shokunin 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/EliasOulkadi/shokunin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.pack/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/EliasOulkadi/shokunin/tree/master/.pack/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/EliasOulkadi/shokunin/tree/master/.pack/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 EliasOulkadi/shokunin --skill react-native -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install EliasOulkadi/shokunin react-native --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.pack/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/EliasOulkadi/shokunin/tree/master/.pack/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 EliasOulkadi/shokunin --skill react-native -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install EliasOulkadi/shokunin react-native --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.pack/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/EliasOulkadi/shokunin/tree/master/.pack/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/EliasOulkadi/shokunin.git --path .pack/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 EliasOulkadi/shokunin --skill react-native -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install EliasOulkadi/shokunin react-native --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.pack/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/EliasOulkadi/shokunin/tree/master/.pack/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 EliasOulkadi/shokunin 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 EliasOulkadi/shokunin --skill react-native -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .github/skills && cp -r skills-src/.pack/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/EliasOulkadi/shokunin/tree/master/.pack/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 EliasOulkadi/shokunin --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 EliasOulkadi/shokunin react-native --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.pack/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/EliasOulkadi/shokunin/tree/master/.pack/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-nativeBuild production React Native apps with Expo SDK 53+, Expo Router (file-based navigation), New Architecture (Fabric + TurboModules), FlashList, Reanimated 4, Zustand for state, Hermes, EAS Build…
React Native is an agent skill from EliasOulkadi/shokunin. Build production React Native apps with Expo SDK 53+, Expo Router (file-based navigation), New Architecture (Fabric + TurboModules), FlashList, Reanimated 4, Zustand for state, Hermes, EAS Build, and App Store/Play Store deployment.
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: opencode
It sits in Mobile, covering Cross-platform mobile apps, State management and App store release. It works with Expo, React Native, Zustand and React. The repository describes itself as: 職人 Shokunin 62 AI agent skills for OpenCode, Claude Code, Cursor, Windsurf. ChromaDB memory, MCP servers, declarative self-updates. Multi-model, open source, zero cost. The licence is MIT.
10 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 4c68e5b. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
basheditglobgrepreadwritewebsearchwebfetchFrom allowed-tools in the SKILL.md frontmatter.
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.
opencode
From compatibility in the SKILL.md frontmatter.
React Native loads about 3k tokens when it runs. Until then it costs about 61 tokens; SKILL.md has 801 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 EliasOulkadi/shokunin at commit 4c68e5b, republished under its MIT licence (© EliasOulkadi). 801 words, ~3,020 tokens.
.claude/skills/react-native/SKILL.md (or your agent's skills folder).Build production React Native apps with Expo, New Architecture, and modern navigation.
npx create-expo-app@latest MyApp --template blank-typescript, configure SDK 53+estimatedItemSize. Optimize renderItem with React.memouseSharedValue + useAnimatedStyle instead of Animated APIexpo-image with cached, resized variants. Never bare <Image> without dimensionsexpo-notifications for push. Handle foreground, background, tap-to-navigatereact-native-screens, InteractionManager.runAfterInteractions for heavy opseas build --platform all --profile production, eas submit, configure CI/CD with GitHub Actions| Scenario | Recommended |
|---|---|
| Greenfield Expo app | Expo Router (file-based, typed routes, deep links) |
| Bare React Native | React Navigation v7 (imperative, full control) |
| Brownfield / native modules | React Navigation v7 |
| Web + mobile | Expo Router (SSR, SEO) |
app/
├ _layout.tsx # Root layout (tabs, stack)
├ index.tsx # /
├ (tabs)/
│ ├ _layout.tsx # Tab config
│ ├ feed.tsx # /feed
│ └ profile.tsx # /profile
├ product/
│ ├ [id].tsx # /product/:id
│ └ review.tsx # /product/:id/review
└ auth/
├ login.tsx # /auth/login
└ signup.tsx # /auth/signupDeep links work automatically. Universal links with app.json scheme config.
// app/product/[id].tsx
import { useLocalSearchParams } from 'expo-router'
export default function ProductScreen() {
const { id } = useLocalSearchParams<{ id: string }>()
// id is typed as string
}type RootStackParamList = {
Home: undefined
ProductDetail: { id: string }
Cart: undefined
}
const Stack = createNativeStackNavigator<RootStackParamList>()
export function RootNavigator() {
return (
<NavigationContainer
linking={{
prefixes: ['myapp://', 'https://myapp.com'],
config: {
screens: {
Home: '',
ProductDetail: 'product/:id',
Cart: 'cart',
},
},
}}>
<Stack.Navigator screenOptions={{ headerShown: false }}>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="ProductDetail" component={ProductDetailScreen} />
<Stack.Screen name="Cart" component={CartScreen} />
</Stack.Navigator>
</NavigationContainer>
)
}| Scenario | Recommended |
|---|---|
| Simple, small app | React Context + useState |
| Medium app | Zustand (minimal boilerplate, hooks-based) |
| Large app, complex state | Redux Toolkit (mature ecosystem, DevTools) |
| Server state | TanStack Query (caching, refetch, pagination) |
import { create } from 'zustand'
import { persist, createJSONStorage } from 'zustand/middleware'
import AsyncStorage from '@react-native-async-storage/async-storage'
interface CartStore {
items: CartItem[]
total: number
addItem: (item: Product) => void
removeItem: (id: string) => void
clear: () => void
}
export const useCartStore = create<CartStore>()(
persist(
(set, get) => ({
items: [],
total: 0,
addItem: (product) => set((state) => ({
items: [...state.items, { ...product, quantity: 1 }],
total: state.total + product.price,
})),
removeItem: (id) => set((state) => ({
items: state.items.filter((i) => i.id !== id),
total: state.items.filter((i) => i.id !== id).reduce((s, i) => s + i.price, 0),
})),
clear: () => set({ items: [], total: 0 }),
}),
{ name: 'cart-storage', storage: createJSONStorage(() => AsyncStorage) }
)
)| Rule | Implementation |
|---|---|
| Enable Hermes | hermes: true in metro.config.js |
| Use FlashList (Shopify) | Replaces FlatList — built-in recycling, better perf |
| InteractionManager | InteractionManager.runAfterInteractions(() => fetchData()) |
| Memoize components | React.memo on screen components, list items |
| Lazy load tab screens | lazy: true (default in Expo Router) |
| Image optimization | expo-image with cached, resized images |
| Avoid inline functions in render | Extract handlers, use useCallback |
| Freeze inactive screens | react-native-screens detaches from native hierarchy |
import { FlashList } from '@shopify/flash-list'
<FlashList
data={items}
renderItem={renderItem}
keyExtractor={(item) => item.id}
estimatedItemSize={120}
/>Enabled by default in Expo SDK 53+.
| Component | Old | New |
|---|---|---|
| Native modules | NativeModules proxy | TurboModules (typed, synchronous) |
| View manager | Fabric not used | Fabric (synchronous rendering) |
| State updates | Bridge (async serialization) | JSI (synchronous, no serialization) |
Ensure compatibility:
// app.json
{
"expo": {
"platforms": ["ios", "android"]
}
}import { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated'
export function AnimatedCard() {
const scale = useSharedValue(1)
const animatedStyle = useAnimatedStyle(() => ({
transform: [{ scale: scale.value }],
}))
return (
<Animated.View
style={animatedStyle}
onTouchStart={() => { scale.value = withSpring(0.95) }}
onTouchEnd={() => { scale.value = withSpring(1) }}
/>
)
}{
"expo": {
"scheme": "myapp",
"plugins": [["expo-linking"]]
}
}Always implement a fallback for malformed links.
import * as Notifications from 'expo-notifications'
const { status } = await Notifications.requestPermissionsAsync()
if (status !== 'granted') return
const token = await Notifications.getExpoPushTokenAsync()
Notifications.addNotificationResponseReceivedListener((response) => {
const { screen, params } = response.notification.request.content.data
router.push({ pathname: screen as any, params: params as any })
})eas build --platform all --profile production
eas submit --platform ios
eas submit --platform android| Scenario | Cause | Fix |
|---|---|---|
| White screen on launch | Unhandled JS exception | Wrap root with ErrorBoundary, add Sentry |
| Deep link opens wrong screen | Missing or incorrect route config | Verify app.json scheme + linking config match |
| Push notification tap does nothing | No notification response listener | Register addNotificationResponseReceivedListener |
| FlashList blank / slow | Missing estimatedItemSize | Measure or estimate item height, pass to prop |
| Hermes crash on third-party lib | Lib not Hermes-compatible | Check lib docs, use Hermes-compatible version |
| EAS build fails on iOS | Missing provisioning profile | Run eas credentials, eas device:create |
| AsyncStorage 64KB limit on Android | Storage exceeds limit | Migrate to MMKV (react-native-mmkv) |
| Reanimated 4 worklet error | Using non-worklet code inside useAnimatedStyle | Only use Reanimated compatible functions inside worklets |
| TurboModule returns undefined | Fabric/TM not enabled | Verify newArchEnabled: true in app.json |
| Navigation state lost on restart | No persistence | Use persistNavigationState from expo-router or React Navigation v7 storage |
expo-image with resizeReact.memo on list items and screensInteractionManager.runAfterInteractions for heavy operationsexpo-constants env segregation (dev / staging / prod)| Anti-pattern | Fix |
|---|---|
| ScrollView for long lists | FlashList with virtualization |
| No Hermes | Enable Hermes — 2x startup improvement |
| Inline arrow functions in render | useCallback or extract to component |
| FlatList without optimization | Use FlashList instead |
| Deep linking as afterthought | Configure at project start |
| No error boundary | Unhandled JS error = white screen |
navigation.getParent() chains | Restructure to flat navigation hierarchy |
setState in navigation handlers | Navigate first, fetch on screen mount |
Using bare <Image> without dimensions | expo-image with explicit width/height |
| Zustand store split across 10 files | Keep logically cohesive, use slices pattern |
| New Architecture disabled by default | Enable newArchEnabled: true in app.json |
| Manual MethodChannel for native | Use Expo Modules API (typed, modern) |
| Ignoring platform-specific safe areas | useSafeAreaInsets from react-native-safe-area-context |
console.log in production builds | Strip via babel plugin (transform-remove-console) |
© EliasOulkadi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .pack/skills/react-native of EliasOulkadi/shokunin.
Open the folder on GitHubat commit 4c68e5b
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 skillEliasOulkadi/shokunin | 114 | — | ~3k | Automated safety check: Pass | MIT | |
| React Native Mmkvmargelo/react-native-skills | 175 | — | ~2.1k | Automated safety check: Pass | MIT | |
| React Native Experttech-leads-club/agent-skills | 7k | — | ~3.2k | Automated safety check: Pass | CC-BY-4.0 | |
| React Native Devaiskillstore/marketplace | 430 | 1 repos | ~1.8k | Automated safety check: Pass | MIT | |
| App Store Reviewsafaiyeh/app-store-review-skill | 362 | 1 repos | ~3.4k | Automated safety check: Pass | MIT | |
| Screenmapaleqsio/screenmap | 242 | — | ~7.2k | Automated safety check: Pass | MIT |
margelo/react-native-skills
Fast synchronous key-value storage for React Native via react-native-mmkv (Nitro-backed).
tech-leads-club/agent-skills
Guides React Native and Expo work for cross-platform apps: Expo Router navigation, fast lists, Reanimated animation, platform-specific code and project structure.
aiskillstore/marketplace
React Native and Expo development guide covering components, styling, animations, navigation, state management, forms, networking, performance optimization, testing, native capabilities, and…
safaiyeh/app-store-review-skill
Evaluates code against Apple's App Store Review Guidelines. An agent skill from safaiyeh/app-store-review-skill.
aleqsio/screenmap
Generate a visual navigation map of an Expo / React Native or NativeScript app.
lovdacn/ui
Manages lovdacn (lvcn) components and projects for Expo & React Native — adding, initializing, fixing, debugging, styling, theming, and composing UI with NativeWind or Uniwind.
EliasOulkadi/shokunin
Design CI/CD pipelines for GitHub Actions, GitLab CI, and CircleCI with matrix builds, test sharding, caching, Docker layer caching, OIDC auth, deployment strategies (rolling, blue-green, canary)…
EliasOulkadi/shokunin
Build production-grade components for React, Vue 3, and Svelte 5 with all states (loading, empty, error, success, idle), TypeScript strict, WCAG 2.2 accessibility, server components (RSC), and…
EliasOulkadi/shokunin
PostgreSQL database administration — backup/restore (pgdump, PITR, WAL archiving), health monitoring (connections, bloat, cache hit ratio, dead tuples), connection pooling (PgBouncer), replication…
EliasOulkadi/shokunin
Design database schemas with Prisma/Drizzle, PostgreSQL index strategy (B-tree, GIN, GiST, BRIN, Hash), query optimization (EXPLAIN ANALYZE), migration safety (expand/contract, zero-downtime), and…
EliasOulkadi/shokunin
Optimize Docker images with multi-stage builds, distroless bases, BuildKit cache mounts, multi-arch builds, compose watch, security hardening (non-root, seccomp, capabilities drop), and…
EliasOulkadi/shokunin
Design error handling, structured logging, and observability with OpenTelemetry (traces, metrics, logs), error classification, recovery patterns (retry with jitter, circuit breaker, bulkhead…
Works with
Categories
Build production React Native apps with Expo SDK 53+, Expo Router (file-based navigation), New Architecture (Fabric + TurboModules), FlashList, Reanimated 4, Zustand for state, Hermes, EAS Build…. React Native is an agent skill from EliasOulkadi/shokunin. Build production React Native apps with Expo SDK 53+, Expo Router (file-based navigation), New Architecture (Fabric + TurboModules), FlashList, Reanimated 4, Zustand for state, Hermes, EAS Build, and App Store/Play Store deployment.
React Native fits situations like: tasks that involve Cross-platform mobile apps; tasks that involve State management; tasks that involve App store release.
Run `npx skills add EliasOulkadi/shokunin --skill react-native -a claude-code`. Or copy the skill folder (.pack/skills/react-native in EliasOulkadi/shokunin) into .claude/skills/react-native in your project. Claude Code loads it when a task matches its description.
Run `npx skills add EliasOulkadi/shokunin --skill react-native -a codex`. Or copy the skill folder (.pack/skills/react-native in EliasOulkadi/shokunin) 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 EliasOulkadi/shokunin --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 the command-line tools its instructions call (eas and npx). Our summary lists: Node.js. Its frontmatter pre-approves these tools: bash, edit, glob, grep, read, write, websearch, webfetch. Compatibility (from SKILL.md): opencode.
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 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.
React Native is published under the MIT licence (declared in SKILL.md). 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.
Skills that share tags, products or a category with React Native: React Native Mmkv (margelo/react-native-skills, 175 stars), React Native Expert (tech-leads-club/agent-skills, 7k stars), React Native Dev (aiskillstore/marketplace, 430 stars) and App Store Review (safaiyeh/app-store-review-skill, 362 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
EliasOulkadi (a GitHub user) maintains it in EliasOulkadi/shokunin, which has 114 GitHub stars. The repository holds 49 skills in this directory. The repository was last updated on October 5, 2026.
Source: EliasOulkadi/shokunin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.