jotai — Claude Code skill: json-render adapter
Turns a Jotai atom into json-render's state backend: install the packages, wrap the atom, share one store with your app.
npx skills add vercel-labs/json-render --skill jotai -a claude-codeWhat jotai does
This skill covers @json-render/jotai, the adapter that hands a Jotai atom to json-render as its StateStore. What you get is a short guide with a TSX example and an options table, not a prebuilt plugin. It earns its place when the UI is rendered from a JSON description and you want the state to live in Jotai.
Setup takes four packages: npm install @json-render/jotai @json-render/core @json-render/react jotai. Then you create a writable atom, wrap it with jotaiStateStore({ atom: uiAtom }), and pass the result to StateProvider from @json-render/react. Every read and write goes through Jotai.
If your app already runs its own <Provider> with a custom store, hand that store over as the second option: jotaiStateStore({ atom: uiAtom, store: jStore }). Skip it and the adapter spins up a fresh store, so useAtom() in your components reads a different state. Worth checking both providers point at the same instance before you debug anything else.
What it helps with
- move json-render state onto Jotai atoms
- share one store between the app and the renderer
- replace the default store with a custom instance
- put together a minimal
StateProviderexample - check which options
jotaiStateStoreaccepts
Example prompts for the agent
- Wire Jotai into json-render: install
@json-render/jotaiand show me theStateProviderwrapper. - json-render is already in the app but the state gets duplicated — move it to
jotaiStateStoreusing ourcreateStore(). - Give me a minimal example with
atom<Record<string, unknown>>andjotaiStateStorefor this screen.
How to install jotai
1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill jotai -a claude-code2Manually: put the files in place
~/.claude/skills/jotai/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/jotai/
1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill jotai -a codex2Manually: put the files in place
.agents/skills/jotai/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill jotai -a cursor2Manually: put the files in place
.cursor/skills/jotai/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install vercel-labs/json-render jotai2Manually: put the files in place
.github/skills/jotai/SKILL.md1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill jotai -a gemini-cli2Platform CLI
gemini skills install https://github.com/vercel-labs/json-render --path skills/jotaiManually: put the files in place
.devin/skills/jotai/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill jotai -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about jotai
How do I install jotai in Claude Code?
Run npx skills add vercel-labs/json-render --skill jotai -a claude-code. The skill file lands at ~/.claude/skills/jotai/SKILL.md.
What does jotai do?
It gives the agent the recipe for @json-render/jotai: create an atom, wrap it in jotaiStateStore, and connect it to StateProvider from @json-render/react.
How do json-render and my components share the same state?
Pass your own instance through the store option: jotaiStateStore({ atom: uiAtom, store: jStore }). Without it the adapter creates a new store, so useAtom() outside a provider using that store sees different state.
Source text
SKILL.md · Apache-2.0
---
name: jotai
description: Jotai adapter for json-render's StateStore interface. Use when integrating json-render with Jotai for state management via @json-render/jotai.
---
# @json-render/jotai
Jotai adapter for json-render's `StateStore` interface. Wire a Jotai atom as the state backend for json-render.
## Installation
```bash
npm install @json-render/jotai @json-render/core @json-render/react jotai
```
## Usage
```tsx
import { atom } from "jotai";
import { jotaiStateStore } from "@json-render/jotai";
import { StateProvider } from "@json-render/react";
// 1. Create an atom that holds the json-render state
const uiAtom = atom<Record<string, unknown>>({ count: 0 });
// 2. Create the json-render StateStore adapter
const store = jotaiStateStore({ atom: uiAtom });
// 3. Use it
<StateProvider store={store}>
{/* json-render reads/writes go through Jotai */}
</StateProvider>
```
### With a Shared Jotai Store
When your app already uses a Jotai `<Provider>` with a custom store, pass it so both json-render and your components share the same state:
```tsx
import { atom, createStore } from "jotai";
import { Provider as JotaiProvider } from "jotai/react";
import { jotaiStateStore } from "@json-render/jotai";
import { StateProvider } from "@json-render/react";
const jStore = createStore();
const uiAtom = atom<Record<string, unknown>>({ count: 0 });
const store = jotaiStateStore({ atom: uiAtom, store: jStore });
<JotaiProvider store={jStore}>
<StateProvider store={store}>
{/* Both json-render and useAtom() see the same state */}
</StateProvider>
</JotaiProvider>
```
## API
### `jotaiStateStore(options)`
Creates a `StateStore` backed by a Jotai atom.
| Option | Type | Required | Description |
|--------|------|----------|-------------|
| `atom` | `WritableAtom<StateModel, [StateModel], void>` | Yes | A writable atom holding the state model |
| `store` | Jotai `Store` | No | The Jotai store instance. Defaults to a new store. Pass your own to share state with `<Provider>`. |
© vercel-labs · Apache-2.0 · vercel-labs/json-render