react-flow-node-ts — Claude Code skill: what it does, how to install
Creates typed React Flow canvas node components with Handle connections and Zustand store integration. Useful when building node-based workflow editors.
npx skills add microsoft/skills --skill react-flow-node-ts -a claude-codeWhat react-flow-node-ts does
This skill streamlines creating TypeScript node components for React Flow canvases. It provides base patterns for component logic and type declarations. Placeholders handle PascalCase component naming and kebab-case node identifiers. The generated component wraps the element in memo, mounts NodeResizer, and configures target and source Handle elements.
The setup relies directly on Zustand. It also expects code inside src/frontend/src/. The node calls useAppStore to track canvas edit modes and run node updates. If your project uses a different state library or directory layout, you must adapt the store hooks and import paths manually.
Setup follows a six-step integration path. It guides you from typing node data and exporting the component to updating store defaults, registering nodeTypes, and wiring the block into UI creation menus.
What it helps with
- scaffold a React Flow node component with target and source handles
- define typed TypeScript interfaces for node data
- bind canvas node updates to a Zustand store
- register custom node types in canvas configs and UI menus
Example prompts for the agent
- Create a VideoNode component for React Flow with TypeScript types and handles
- Generate a custom canvas node and wire its actions to the Zustand store
- Scaffold a resizable workflow node following the react-flow-node-ts pattern
How to install react-flow-node-ts
1Skills CLI (Vercel)
npx skills add microsoft/skills --skill react-flow-node-ts -a claude-code2Manually: put the files in place
~/.claude/skills/react-flow-node-ts/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/react-flow-node-ts/
Manually: put the files in place
.agents/skills/react-flow-node-ts/SKILL.mdFor all projects use ~/.agents/skills/
Manually: put the files in place
.cursor/skills/react-flow-node-ts/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install microsoft/skills react-flow-node-ts2Manually: put the files in place
.github/skills/react-flow-node-ts/SKILL.mdPlatform CLI
gemini skills install https://github.com/microsoft/skills --path .github/plugins/azure-sdk-typescript/skills/react-flow-node-tsManually: put the files in place
.devin/skills/react-flow-node-ts/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.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 react-flow-node-ts
How to install react-flow-node-ts in Claude Code?
Run npx skills add microsoft/skills --skill react-flow-node-ts -a claude-code in your terminal. You can also place the specification file directly at ~/.claude/skills/react-flow-node-ts/SKILL.md.
What is included in the node template?
The template includes a memoized React component with Handle ports and a dedicated TypeScript definition file for custom node data.
Can this skill be used without Zustand?
The template directly imports useAppStore to check canvas modes and update node state. If your project does not use Zustand, you must replace those store calls manually.
Source text
SKILL.md · MIT
---
name: react-flow-node-ts
description: Create React Flow node components with TypeScript types, handles, and Zustand integration. Use when building custom nodes for React Flow canvas, creating visual workflow editors, or implementing node-based UI components.
license: MIT
metadata:
author: Microsoft
version: "1.0.0"
---
# React Flow Node
Create React Flow node components following established patterns with proper TypeScript types and store integration.
## Quick Start
Copy templates from [assets/](assets/) and replace placeholders:
- `{{NodeName}}` → PascalCase component name (e.g., `VideoNode`)
- `{{nodeType}}` → kebab-case type identifier (e.g., `video-node`)
- `{{NodeData}}` → Data interface name (e.g., `VideoNodeData`)
## Templates
- [assets/template.tsx](assets/template.tsx) - Node component
- [assets/types.template.ts](assets/types.template.ts) - TypeScript definitions
## Node Component Pattern
```tsx
export const MyNode = memo(function MyNode({
id,
data,
selected,
width,
height,
}: MyNodeProps) {
const updateNode = useAppStore((state) => state.updateNode);
const canvasMode = useAppStore((state) => state.canvasMode);
return (
<>
<NodeResizer isVisible={selected && canvasMode === 'editing'} />
<div className="node-container">
<Handle type="target" position={Position.Top} />
{/* Node content */}
<Handle type="source" position={Position.Bottom} />
</div>
</>
);
});
```
## Type Definition Pattern
```typescript
export interface MyNodeData extends Record<string, unknown> {
title: string;
description?: string;
}
export type MyNode = Node<MyNodeData, 'my-node'>;
```
## Integration Steps
1. Add type to `src/frontend/src/types/index.ts`
2. Create component in `src/frontend/src/components/nodes/`
3. Export from `src/frontend/src/components/nodes/index.ts`
4. Add defaults in `src/frontend/src/store/app-store.ts`
5. Register in canvas `nodeTypes`
6. Add to AddBlockMenu and ConnectMenu
© Microsoft · MIT · microsoft/skills