Skip to main content
skill Claude Code CX Codex Cursor GitHub Copilot

react-19 — Claude Code skill: React 19 patterns, how to install

Skill for React 19 with React Compiler: no manual memoization, server components first, ref as a prop.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add prowler-cloud/prowler --skill react-19 -a claude-code
Open on GitHub

What react-19 does

The skill teaches the agent to write components following React 19 and React Compiler rules. React Compiler optimizes code automatically, so useMemo and useCallback are no longer needed — the agent writes plain functions and variables, the compiler memoizes everything. Server components are now the default, the "use client" directive only where state hooks, event handlers, or browser APIs are required.

Includes the new use() hook for reading promises and conditional context, useActionState for forms with pending state, and ref as a regular prop without forwardRef. The agent imports hooks by name (import { useState } from "react"), not through React.useState.

Triggers when writing .tsx components. If the project uses Next.js App Router or Server Actions, the nextjs-16 skill is recommended alongside.

What it helps with

  • remove unnecessary useMemo and useCallback from React 19 components
  • split server and client components following new rules
  • rewrite forwardRef to ref as a prop
  • handle promises with the use() hook instead of useEffect
  • set up forms with useActionState and pending indicators

Example prompts for the agent

  • write a list component in React 19 without memoization
  • convert this component from `forwardRef` to `ref` as a prop
  • create a server component for the page, client component only for the button

How to install react-19

1Skills CLI (Vercel)

npx skills add prowler-cloud/prowler --skill react-19 -a claude-code

2Manually: put the files in place

~/.claude/skills/react-19/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/react-19/

From the same set4

The whole set →

Similar

shadcn-svelte vercel-labs Pre-built definitions and implementations of 36 shadcn components for json-render apps. Built on Svelte 5 and Tailwind CSS. Claude Code CX Codex Cursor +1 1,100installs salesforce-component-standards official github Guides Salesforce UI development across LWC, Aura, and Visualforce. Enforces SLDS 2 compliance, accessibility, and platform security. GitHub Copilot 770installs react18-dep-compatibility official github Checks minimum dependency versions for React 18.3.1 and React 19. Use it during React upgrades and when resolving peer dependency conflicts. GitHub Copilot 764installs react18-batching-patterns official github Diagnoses and fixes React 18 automatic batching bugs in class components. Useful when upgrading from React 17 breaks state assertions or async flows. GitHub Copilot 754installs svelte-code-writer sveltejs Fetches Svelte 5 documentation and analyzes components using autofixer. Useful when authoring or debugging .svelte and .svelte.ts files. Claude Code CX Codex Cursor +1 12,800installs react18-legacy-context official github This skill migrates React legacy context to createContext and coordinates the provider with every consumer. Use it for class component context migrations. GitHub Copilot 745installs frontend-design official anthropics This skill guides intentional visual design for new interfaces and redesigns. Use it when a generic generated UI is not enough. Claude Code Claude.ai 1,025,790installs design-taste-frontend Leonxlnx This skill directs the design of public pages and work screens, then checks the result in a browser through screenshots. Use it when an interface feels generic or unfinished. Claude Code CX Codex Cursor +1 673,100installs

Questions about react-19

How to install react-19 in Claude Code?

Run npx skills add prowler-cloud/prowler --skill react-19 -a claude-code, the skill will appear in ~/.claude/skills/react-19/SKILL.md.

What does the react-19 skill do?

Teaches the agent to write components following React 19 rules: no manual memoization (React Compiler optimizes automatically), server components first, ref as a regular prop, the use() hook for promises, and useActionState for forms.

When is the "use client" directive needed?

Only where state hooks (useState, useEffect, useRef, useContext), event handlers, or browser APIs like window and localStorage are used. Server components work without the directive.

Source text

SKILL.md · Apache-2.0
---
name: react-19
description: >
  React 19 patterns with React Compiler.
  Trigger: When writing React 19 components/hooks in .tsx (React Compiler rules, hook patterns, refs as props). If using Next.js App Router/Server Actions, also use nextjs-16.
license: Apache-2.0
metadata:
  author: prowler-cloud
  version: "1.0"
  scope: [root, ui]
  auto_invoke: "Writing React components"
allowed-tools: Read, Edit, Write, Glob, Grep, Bash, WebFetch, WebSearch, Task
---

## No Manual Memoization (REQUIRED)

```typescript
// ✅ React Compiler handles optimization automatically
function Component({ items }) {
  const filtered = items.filter(x => x.active);
  const sorted = filtered.sort((a, b) => a.name.localeCompare(b.name));

  const handleClick = (id) => {
    console.log(id);
  };

  return <List items={sorted} onClick={handleClick} />;
}

// ❌ NEVER: Manual memoization
const filtered = useMemo(() => items.filter(x => x.active), [items]);
const handleClick = useCallback((id) => console.log(id), []);
```

## Imports (REQUIRED)

```typescript
// ✅ ALWAYS: Named imports
import { useState, useEffect, useRef } from "react";

// ❌ NEVER
import React from "react";
import * as React from "react";
```

## Server Components First

```typescript
// ✅ Server Component (default) - no directive
export default async function Page() {
  const data = await fetchData();
  return <ClientComponent data={data} />;
}

// ✅ Client Component - only when needed
"use client";
export function Interactive() {
  const [state, setState] = useState(false);
  return <button onClick={() => setState(!state)}>Toggle</button>;
}
```

## When to use "use client"

- useState, useEffect, useRef, useContext
- Event handlers (onClick, onChange)
- Browser APIs (window, localStorage)

## use() Hook

```typescript
import { use } from "react";

// Read promises (suspends until resolved)
function Comments({ promise }) {
  const comments = use(promise);
  return comments.map(c => <div key={c.id}>{c.text}</div>);
}

// Conditional context (not possible with useContext!)
function Theme({ showTheme }) {
  if (showTheme) {
    const theme = use(ThemeContext);
    return <div style={{ color: theme.primary }}>Themed</div>;
  }
  return <div>Plain</div>;
}
```

## Actions & useActionState

```typescript
"use server";
async function submitForm(formData: FormData) {
  await saveToDatabase(formData);
  revalidatePath("/");
}

// With pending state
import { useActionState } from "react";

function Form() {
  const [state, action, isPending] = useActionState(submitForm, null);
  return (
    <form action={action}>
      <button disabled={isPending}>
        {isPending ? "Saving..." : "Save"}
      </button>
    </form>
  );
}
```

## ref as Prop (No forwardRef)

```typescript
// ✅ React 19: ref is just a prop
function Input({ ref, ...props }) {
  return <input ref={ref} {...props} />;
}

// ❌ Old way (unnecessary now)
const Input = forwardRef((props, ref) => <input ref={ref} {...props} />);
```

© prowler-cloud · Apache-2.0 · prowler-cloud/prowler

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor