Awesome-omni-skill claude-agent-ui-ts
Add a React + WebSocket UI on top of Claude Agent SDK agents with tool approval and SQLite persistence
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/claude-agent-ui-ts" ~/.claude/skills/diegosouzapw-awesome-omni-skill-claude-agent-ui-ts && rm -rf "$T"
skills/development/claude-agent-ui-ts/SKILL.mdClaude Agent UI (TypeScript)
Add a web UI to your Claude Agent SDK agents. Includes real-time WebSocket communication, interactive tool approval, and SQLite persistence for chat history.
Prerequisites
- Node.js 18+
- Claude Agent SDK configured (see claude-agent-sdk-ts skill for setup)
Quick Start
-
Copy the snippets to your project:
from this skillclient.tsx
andwebsocket-server-sqlite.ts
from claude-agent-sdk-ts skillwebsocket-types.ts
-
Install dependencies:
npm install express cors ws @anthropic-ai/claude-agent-sdk better-sqlite3 react react-dom npm install -D @types/better-sqlite3 @types/express @types/cors @types/ws -
Edit the server CONFIG section (workingDirectory, model, allowedTools, dbPath)
-
Start server:
npx tsx server.ts -
Add
to your React app and open in browserclient.tsx
Architecture
React Client <--WebSocket--> Express Server <--SDK--> Claude Agent (client.tsx) (server.ts) | v SQLite DB (chat.db)
Flow:
- User types message in React UI
- Message sent via WebSocket to server
- Server persists message to SQLite and forwards to Claude Agent SDK
- When agent wants to use a tool, server sends approval request to client
- User approves or rejects in UI
- Server continues or blocks tool based on response
- Agent responses persisted to SQLite and streamed back to UI
Snippets
| Snippet | Source | Description |
|---|---|---|
| This skill | React chat UI with WebSocket and tool approval buttons |
| claude-agent-sdk-ts | Express + WebSocket + SQLite server with SDK integration |
| claude-agent-sdk-ts | Shared TypeScript types for messages |
Configuration
Edit the CONFIG object in the server:
const CONFIG = { port: 3001, workingDirectory: process.cwd(), // Scope file operations model: "sonnet", // opus, sonnet, or haiku allowedTools: ["Bash", "Read", "Write", "Edit", "Glob", "Grep"], systemPrompt: "You are a helpful AI assistant.", dbPath: "./chat.db", // SQLite database path };
See claude-agent-sdk-ts skill for detailed configuration options.
Persistence
The server uses SQLite (via better-sqlite3) to persist:
- Chat messages: All user, assistant, and tool_use messages
- SDK session ID: Captured from
message for session resumptionsystem/init
Database schema:
-- Sessions: stores SDK session ID for multi-turn resumption CREATE TABLE sessions ( id TEXT PRIMARY KEY, sdk_session_id TEXT, created_at TEXT, updated_at TEXT ); -- Messages: stores all chat messages CREATE TABLE messages ( id TEXT PRIMARY KEY, session_id TEXT, role TEXT, -- 'user' | 'assistant' | 'tool_use' content TEXT, tool_name TEXT, -- for tool_use messages tool_input TEXT, -- JSON string for tool_use messages timestamp TEXT );
Session Resumption: When the server restarts, it:
- Loads existing messages from SQLite
- Retrieves the stored SDK session ID
- Passes
to the SDK query optionsresume: sdkSessionId - Claude resumes with full conversation context
This follows the SDK best practice of capturing
session_id from the system/init message and using resume for multi-turn conversations.
Styling
The client has no styling (functional HTML only). Options:
- Add your own CSS
- Use Tailwind CSS
- Use claude-agent-terminal-ts for a styled terminal theme
Production Notes
For production deployment, consider:
- Authentication: Add user auth (not included)
- Multi-chat: Extend from single session to
for multiple conversationsMap<chatId, Session> - Containerization: Isolate SDK in separate container for security
- Backup: Add SQLite backup strategy (WAL mode already enabled for durability)
- Error handling: Add retry logic and graceful degradation
Related Skills
| Skill | Use When |
|---|---|
| claude-agent-sdk-ts | SDK API details, tools, hooks, configuration, shared server code |
| claude-agent-terminal-ts | Terminal-styled UI with dark theme and keyboard shortcuts |