home / skills / storybookjs / react-native / setup-react-native-storybook

setup-react-native-storybook skill

/skills/setup-react-native-storybook

This skill helps you add and configure Storybook for React Native across Expo, React Native CLI, and Re.Pack projects, boosting component-driven development.

npx playbooks add skill storybookjs/react-native --skill setup-react-native-storybook

Review the files below or copy the command above to add this skill to your agents.

Files (5)
SKILL.md
4.7 KB
---
name: setup-react-native-storybook
description: Set up Storybook for React Native in Expo, React Native CLI, or Re.Pack projects. Use when adding Storybook to a project, configuring metro.config.js with withStorybook, creating .rnstorybook configuration files, setting up Storybook routes in Expo Router, configuring getStorybookUI, or adding the StorybookPlugin to a Re.Pack rspack/webpack config. Covers Expo, Expo Router, plain React Native CLI, and Re.Pack setups.
---

# React Native Storybook Setup

Add `@storybook/react-native` v10 to a React Native project.

**Important:** Detect the project's package manager (look for `yarn.lock`, `pnpm-lock.yaml`, or `bun.lockb`) and use it for all install/run commands instead of `npm`. The examples below use `npm` but substitute accordingly (e.g. `yarn add` instead of `npm install`, `yarn storybook` instead of `npm run storybook`). For Expo projects, use `npx expo install` (or `bunx expo install`, etc.) to install dependencies so Expo can resolve compatible versions.

For the init command, use `<pm> create storybook` with the flags shown below. Only npm needs `--` before the flags. Never use `npx`/`bunx` etc for this.

Four setup flows based on project type:

1. **Expo (no router)** - see [references/expo-setup.md](references/expo-setup.md)
2. **Expo with Expo Router** - see [references/expo-router-setup.md](references/expo-router-setup.md)
3. **React Native CLI (no Expo)** - see [references/react-native-cli-setup.md](references/react-native-cli-setup.md)
4. **Re.Pack (rspack/webpack)** - see [references/repack-setup.md](references/repack-setup.md)

## Flow Selection

- Project has `rspack.config` or `webpack.config` and uses `@callstack/repack` -> **Re.Pack**
- Project has `app/` directory with `_layout.tsx` and uses `expo-router` -> **Expo Router**
- Project uses Expo but not file-based routing -> **Expo**
- Project uses `@react-native-community/cli` with no Expo -> **React Native CLI**

## Common Steps (all flows)

### 1. Run CLI Init

```bash
npm create storybook -- --type react_native --yes
# or: pnpm create storybook --type react_native --yes
# or: bun create storybook --type react_native --yes
```

This installs dependencies and creates `.rnstorybook/` with `main.ts`, `preview.tsx`, and `index.tsx`.

### 2. Enable WebSockets in .rnstorybook/index.tsx

Update the generated `.rnstorybook/index.tsx` to enable WebSocket support. This is required for remote control and syncing with the Storybook web companion:

```tsx
// .rnstorybook/index.tsx
import AsyncStorage from '@react-native-async-storage/async-storage';
import { view } from './storybook.requires';

const StorybookUIRoot = view.getStorybookUI({
  storage: {
    getItem: AsyncStorage.getItem,
    setItem: AsyncStorage.setItem,
  },
  enableWebsockets: true,
});

export default StorybookUIRoot;
```

If the project doesn't have `@react-native-async-storage/async-storage`, install it:

```bash
npm install @react-native-async-storage/async-storage
```

### 3. Update Story Globs in main.ts

The CLI generates a default `stories` glob in `.rnstorybook/main.ts`. Keep the existing glob and add an additional entry pointing to where UI components actually live in the project. Look for directories like `components/`, `src/components/`, `src/`, `ui/`, etc.:

```ts
// .rnstorybook/main.ts
const main: StorybookConfig = {
  stories: [
    './stories/**/*.stories.?(ts|tsx|js|jsx)', // example stories from init
    '../src/components/**/*.stories.?(ts|tsx|js|jsx)', // add based on project structure
  ],
  // ...
};
```

### 4. Configure Bundler

For Metro projects, wrap the metro config with `withStorybook`. For Re.Pack projects, add the `StorybookPlugin` to your rspack/webpack config. See the relevant reference file for details.

### 5. Create Entrypoint

How Storybook is rendered differs per flow - see the relevant reference file.

### 6. Run

```bash
npm run start
npm run ios     # or npm run android
```

## withStorybook Options (Metro)

```js
module.exports = withStorybook(config, {
  enabled: true, // Remove Storybook from bundle when false
  configPath: './.rnstorybook', // Storybook config directory
  useJs: false, // Generate .js instead of .ts
  docTools: true, // Auto arg extraction
  liteMode: false, // Mock default UI deps (use with react-native-ui-lite)
  websockets: { port: 7007, host: 'localhost' }, // Remote control
});
```

## StorybookPlugin Options (Re.Pack)

```js
new StorybookPlugin({
  enabled: true, // Strip Storybook from bundle when false
  configPath: './.rnstorybook', // Storybook config directory
  useJs: false, // Generate .js instead of .ts
  docTools: true, // Auto arg extraction
  liteMode: false, // Mock default UI deps (use with react-native-ui-lite)
  websockets: 'auto', // 'auto' detects LAN IP, or { port: 7007, host: 'localhost' }
});
```

Overview

This skill sets up Storybook for React Native across Expo, Expo Router, React Native CLI, and Re.Pack (rspack/webpack) projects. It guides installing @storybook/react-native v10, creating the .rnstorybook config, wiring getStorybookUI, and configuring the bundler so Storybook is included or stripped from app bundles. The goal is a repeatable, package-manager-aware setup that works with Expo-specific requirements and remote control via WebSockets.

How this skill works

The skill detects project type and recommends one of four flows: Expo, Expo Router, React Native CLI, or Re.Pack. It runs the Storybook init CLI to generate .rnstorybook, updates index.tsx to enable WebSockets and AsyncStorage, expands story globs in main.ts, and configures the bundler (withStorybook for Metro or StorybookPlugin for Re.Pack). It also outlines entrypoint wiring and run commands using the detected package manager.

When to use it

  • Adding Storybook to an existing Expo, Expo Router, or React Native CLI app.
  • Setting up Storybook in a Re.Pack project using rspack or webpack.
  • Configuring metro.config.js to include withStorybook for Metro bundler.
  • Enabling remote control and syncing via WebSockets for the React Native Storybook UI.
  • Creating or adjusting .rnstorybook main.ts, preview.tsx, and index.tsx for your component globs.

Best practices

  • Detect and use the project's package manager (yarn/pnpm/bun) for all install and run commands.
  • Use npx/bunx expo install for Expo-managed dependencies so Expo resolves compatible versions.
  • Keep the generated stories glob and add globs pointing to your actual UI/component directories.
  • Enable WebSockets in .rnstorybook/index.tsx and wire AsyncStorage for remote control and companion syncing.
  • Wrap Metro config with withStorybook or add StorybookPlugin to Re.Pack to allow easy stripping of Storybook from production bundles.

Example use cases

  • Add Storybook to an Expo app to develop and visually test components outside of app navigation.
  • Integrate Storybook into an Expo Router app and expose a Storybook route alongside normal routes.
  • Set up Storybook in a plain React Native CLI project and configure metro.config.js with withStorybook.
  • Configure StorybookPlugin in a Re.Pack rspack/webpack config to support fast bundling and optional removal in production.
  • Enable remote device sync and hot reloading of stories using WebSockets and AsyncStorage.

FAQ

Which package manager should I use for installs and running storybook?

Always use the package manager detected in the project (yarn, pnpm, or bun). For Expo, use npx expo install or the equivalent bunx/pnpm command so Expo can pick compatible versions.

How do I enable remote control and the web companion?

Enable enableWebsockets: true in .rnstorybook/index.tsx and provide AsyncStorage getItem/setItem. Configure websockets options in withStorybook or StorybookPlugin if you need a custom host/port.