Kite

AG-UIA2UITanstack StartViteTypeScript

A reference implementation of the AG-UI protocol and A2UI specification a chat interface whose purpose is not merely to respond, but to make the ordinarily invisible machinery of agent communication legible.

What It Is and Why It Exists

Most chat applications are, at their architectural core, a polite fiction. The user types something; a distant model produces tokens; those tokens are streamed into a box. The intermediate layer the actual structure of how an agent communicates with a frontend is hidden entirely, smoothed over, rendered invisible by good UX instincts and, one suspects, a certain indifference to the question of whether it could be otherwise.

Kite is an attempt at otherwise.

The AG-UI protocol defines a standard event stream between an agent backend and a frontend. Not a blob of text, not a stream of raw tokens, but a structured sequence of typed events text deltas, tool invocations, state transitions each one a legible signal rather than an undifferentiated murmur. The A2UI specification extends this further, allowing agents to emit typed UI component descriptors that the frontend renders directly. The agent doesn't describe a table and hope you can picture it. It sends a table.

Kite implements both, which means the interface has something to show you beyond the final answer.

The Interesting Parts

Sidenote: AG-UI Protocol

Consuming an AG-UI event stream faithfully is, in practice, a question of discipline. The frontend must correctly handle every event type as it arrives text deltas, component render events, tool calls without collapsing the distinction between them or treating any as a special case to be bolted on later. Kite renders each event type in-place as it arrives, so the interface reflects the agent's actual execution state rather than a tidy retrospective summary of it.

The A2UI layer is where things become genuinely interesting. A component descriptor arrives; the frontend renders it. This sounds almost too simple, until you consider what it replaces: an entire category of bespoke, case-by-case frontend logic, conditionally applied based on what the model happened to say. The specification makes explicit what was previously implicit, and the interface becomes correspondingly more reliable.

There is something calming, to me at least, about the regularity of it all.

Tech Stack

Built on TanStack Start with Vite. TypeScript throughout. Deployed on Netlify.


Website Source Code