Public beta

UI Components for Agent Harnesses

Schema-based components with bidirectional type safety. Prop schemas define what LLMs send. Action schemas define what users send back. Works across LangChain, Claude, Vercel AI SDK, and more.

Works with
LangChain
LangChain
Claude
Claude
React
React
Next.js
Next.js
Electron
Electron
React Native
React Native
Vercel AI
Vercel AI

Schema Architecture

Prop Schema (LLM → UI)
emailCardSchema = z.object({
  messageId: z.string(),
  from: z.object({
    name: z.string(),
    email: z.string()
  }),
  subject: z.string()
})

Defines what data the LLM sends to render components. Zod validation ensures type safety.

Action Schema (User → LLM)
emailCardActions = {
  reply: {
    params: z.object({
      messageId: z.string(),
      threadId: z.string()
    })
  }
}

Defines what data components send back when users interact. Bidirectional type safety.

01

Schema-First

Prop schemas define LLM outputs. Action schemas define user inputs. Zod validation ensures type safety in both directions.

02

Framework-Agnostic

Works with LangChain, Claude, CrewAI, Vercel AI SDK. Universal component registry that adapts to any runtime.

03

Cross-Platform

Next.js, Electron, React Native—anywhere React runs. Server-side, client-side, or native. Your stack, your rules.

Why harness-ui?

Streaming-Aware

Components handle partial data and loading states gracefully out of the box. No more flickering or awkward jumps.

Bidirectional Actions

The agent renders the UI, and the user can act back. Simplified event handling for agent-to-UI loops.

Zero Dependencies

We don't force you into Vercel AI SDK or LangChain. Use whatever LLM orchestrator you want.

// Framework-agnostic streaming
import {
  StreamingProvider,
  useStreamingController,
  ConnectedStreamingText
} from "harness-ui";

// Push chunks from SSE, fetch, or WebSocket
const { pushChunk, complete } = useStreamingController();
const sse = new EventSource("/api/chat");
sse.onmessage = (e) => pushChunk("msg-1", e.data);
sse.onerror = () => complete("msg-1");

// Component auto-updates
<ConnectedStreamingText streamId="msg-1" />

How we compare

The first UI library built specifically for Agentic workflows.

FeatureVercel AI Elementsharness-uiVercel streamUI
Generative UIManual (developer writes conditionals)
Built-in registry pattern
Built-in (server-side only)
CSR supportYes
Yes
No (RSC only)
SSR supportYes
Yes
Yes
Cross-platformNext.js only
Electron, RN, Web
Next.js only
Schema validationNone
Zod built-in
None
MCP discoveryNo
Yes
No
Production readyYes
Yes
Experimental

Ready to build your next agent?

Start with our industry-organized shortcuts and scale with our composable primitives.