Kanshō
Open source·React + Tailwind

Open-source UI for the screens after chat.

Plans, tool calls, permission gates, memory, traces, cost, failures, and human review. Free and open source, built on React and Tailwind.

Get notified when it ships. Free and open source.

Luminous valley landscape — Hudson River School painting by Thomas Cole
workbench.local/run/agent-ui-proofrunning

Active run

Build the approval surface

0s

Most AI UI kits stop at chat.

Message bubble. Input field. Typing indicator. Real agent products are not chatbots. They plan. They call tools. They ask for permission. They fail in specific ways. They cost money per run.

A component for every part of a run.

Eight categories. Built around what agents actually do, not what chatbots look like.

Every run leaves a receipt.

Checks, costs, and outcomes are logged beside the work. When a run finishes the evidence is already there: lint, types, tests, policy. Not buried in a log.

See the verification receipt
Catskill Mountains panorama — Hudson River School landscape

Verification passed

run/agent-ui-proof · 3m 18s

Lint
0 errors
Types
tsc --noEmit
Tests
182 passed
Policy
sandbox accepted

verification.finished → Verification receipt

Gate what the agent can touch.

Consequential actions pause for a human. Approve, deny, or edit the scope. Nothing lands quietly. The permission gate is a real component, not a pattern you build from scratch.

See the permission gate
Italian Campagna at golden hour — classical landscape with ruins
Awaiting approval

Apply remote diff

The agent wants to write two files. Review before it touches the workspace.

DenyApprove

permission.requested → Permission gate

Review every change before it lands.

Remote edits arrive as proposals. Diffs render inline with line-level markers before anything is written. Review the patch, request changes, or accept. The agent waits.

See the diff review
Gulf of Salerno — Hudson River School coastal landscape
presence.ts+3−1· 2 files
41 export function PresenceBadge({ user }: Props) {
42 const status = user.online ? 'on' : 'off';
42+ const status = derivePresence(user.lastSeen);
43+ const label = PRESENCE_LABELS[status];
44 return <Dot tone={status} title={label} />;
Request changesAccept patch
Free · MIT

The code is free.

Free and open source. MIT licensed. No dependency, no subscription. Yours to read, copy, and ship.

Coming soon

The Figma template is paid.

The polished design system for designers: variables, light and dark, six workflows, component naming, file structure, and documentation. One purchase, yours to keep.

Get notified when it ships.

The Figma template, the registry, and more components. One email.

No spam. One email when it ships.

Build agents people can trust.

Good agents ask before they overstep, show their work, and keep the human in charge. Kanshō is the starting point. The code is free.

Built withReactTailwindTypeScript