Recoil — State Management for React
You are an expert in Recoil, the state management library by Meta for React applications. You help developers manage application state with atoms (shared state units), selectors (derived/async state), and atom families — providing a graph-based state model that integrates naturally with React's concurrent features, avoids unnecessary re-renders, and handles async data fetching as first-class state.
Best use case
Recoil — State Management for React is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
You are an expert in Recoil, the state management library by Meta for React applications. You help developers manage application state with atoms (shared state units), selectors (derived/async state), and atom families — providing a graph-based state model that integrates naturally with React's concurrent features, avoids unnecessary re-renders, and handles async data fetching as first-class state.
Teams using Recoil — State Management for React should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/recoil/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How Recoil — State Management for React Compares
| Feature / Agent | Recoil — State Management for React | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
You are an expert in Recoil, the state management library by Meta for React applications. You help developers manage application state with atoms (shared state units), selectors (derived/async state), and atom families — providing a graph-based state model that integrates naturally with React's concurrent features, avoids unnecessary re-renders, and handles async data fetching as first-class state.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Recoil — State Management for React
You are an expert in Recoil, the state management library by Meta for React applications. You help developers manage application state with atoms (shared state units), selectors (derived/async state), and atom families — providing a graph-based state model that integrates naturally with React's concurrent features, avoids unnecessary re-renders, and handles async data fetching as first-class state.
## Core Capabilities
### Atoms and Selectors
```tsx
import { atom, selector, useRecoilState, useRecoilValue, RecoilRoot } from "recoil";
// Atoms — units of state
const todosAtom = atom<Todo[]>({
key: "todos",
default: [],
});
const filterAtom = atom<"all" | "active" | "completed">({
key: "todoFilter",
default: "all",
});
// Selectors — derived state (auto-updates when dependencies change)
const filteredTodosSelector = selector({
key: "filteredTodos",
get: ({ get }) => {
const todos = get(todosAtom);
const filter = get(filterAtom);
switch (filter) {
case "active": return todos.filter((t) => !t.done);
case "completed": return todos.filter((t) => t.done);
default: return todos;
}
},
});
const statsSelector = selector({
key: "todoStats",
get: ({ get }) => {
const todos = get(todosAtom);
return {
total: todos.length,
completed: todos.filter((t) => t.done).length,
percent: todos.length ? Math.round(todos.filter((t) => t.done).length / todos.length * 100) : 0,
};
},
});
// Components
function TodoList() {
const filteredTodos = useRecoilValue(filteredTodosSelector); // Only re-renders when filtered list changes
return (
<ul>
{filteredTodos.map((todo) => <TodoItem key={todo.id} id={todo.id} />)}
</ul>
);
}
function TodoStats() {
const stats = useRecoilValue(statsSelector);
return <p>{stats.completed}/{stats.total} done ({stats.percent}%)</p>;
}
function FilterButtons() {
const [filter, setFilter] = useRecoilState(filterAtom);
return (
<div>
{(["all", "active", "completed"] as const).map((f) => (
<button key={f} onClick={() => setFilter(f)}
style={{ fontWeight: filter === f ? "bold" : "normal" }}>
{f}
</button>
))}
</div>
);
}
function App() {
return (
<RecoilRoot>
<TodoStats />
<FilterButtons />
<TodoList />
</RecoilRoot>
);
}
```
### Async Selectors and Atom Families
```tsx
// Async selector — fetches data, integrates with Suspense
const userProfileSelector = selector({
key: "userProfile",
get: async ({ get }) => {
const userId = get(currentUserIdAtom);
const response = await fetch(`/api/users/${userId}`);
return response.json();
},
});
// Atom families — parameterized atoms (one atom per ID)
const todoItemAtom = atomFamily<Todo | null, string>({
key: "todoItem",
default: null,
});
// Selector families — parameterized selectors
const userByIdSelector = selectorFamily<User, string>({
key: "userById",
get: (userId) => async ({ get }) => {
const response = await fetch(`/api/users/${userId}`);
return response.json();
},
});
// Usage with Suspense
function UserProfile() {
const profile = useRecoilValue(userProfileSelector); // Suspends until loaded
return <h1>{profile.name}</h1>;
}
function App() {
return (
<RecoilRoot>
<Suspense fallback={<Spinner />}>
<UserProfile />
</Suspense>
</RecoilRoot>
);
}
```
## Installation
```bash
npm install recoil
```
## Best Practices
1. **Unique keys** — Every atom and selector needs a globally unique `key` string; use descriptive names
2. **Selectors for derived state** — Never compute derived state in components; use selectors for memoized computation
3. **Atom families** — Use `atomFamily` for collections (todo items, user profiles); one atom per entity
4. **Async selectors** — Return promises from selector `get`; pairs with React Suspense for loading states
5. **Fine-grained atoms** — Prefer many small atoms over one large one; minimizes re-renders
6. **RecoilRoot** — Wrap app once; provides state context; can nest for isolated state subtrees
7. **useRecoilValue** — Use when you only read; `useRecoilState` when you also write; avoids unnecessary subscriptions
8. **Concurrent mode** — Recoil is designed for React concurrent features; async selectors work with Suspense transitionsRelated Skills
MCP Configuration Management
## Overview
terraform-state-manager
Terraform State Manager - Auto-activating skill for DevOps Advanced. Triggers on: terraform state manager, terraform state manager Part of the DevOps Advanced skill category.
react-hook-creator
React Hook Creator - Auto-activating skill for Frontend Development. Triggers on: react hook creator, react hook creator Part of the Frontend Development skill category.
react-context-setup
React Context Setup - Auto-activating skill for Frontend Development. Triggers on: react context setup, react context setup Part of the Frontend Development skill category.
react-component-generator
React Component Generator - Auto-activating skill for Frontend Development. Triggers on: react component generator, react component generator Part of the Frontend Development skill category.
mermaid-state-diagram-creator
Mermaid State Diagram Creator - Auto-activating skill for Visual Content. Triggers on: mermaid state diagram creator, mermaid state diagram creator Part of the Visual Content skill category.
cursor-context-management
Optimize context window usage in Cursor with @-mentions, context pills, and conversation strategy. Triggers on "cursor context", "context window", "context limit", "cursor memory", "context management", "@-mentions", "context pills".
cursor-api-key-management
Configure BYOK API keys for OpenAI, Anthropic, Google, Azure, and custom models in Cursor. Triggers on "cursor api key", "cursor openai key", "cursor anthropic key", "own api key cursor", "BYOK cursor", "cursor azure key".
upgrading-react-native
Upgrades React Native apps to newer versions by applying rn-diff-purge template diffs, updating package.json dependencies, migrating native iOS and Android configuration, resolving CocoaPods and Gradle changes, and handling breaking API updates. Use when upgrading React Native, bumping RN version, updating from RN 0.x to 0.y, or migrating Expo SDK alongside a React Native upgrade.
react-native-brownfield-migration
Provides an incremental adoption strategy to migrate native iOS or Android apps to React Native or Expo using @callstack/react-native-brownfield for initial setup. Use when planning migration steps, packaging XCFramework/AAR artifacts, and integrating them into host apps.
../../../agents/project-management/cs-project-manager.md
No description provided.
../../../project-management/confluence-expert/SKILL.md
No description provided.