Kouto: An Agentic Voice Agent for macOS by Aavirash MitraKouto: An Agentic Voice Agent for macOS by Aavirash Mitra

Kouto: An Agentic Voice Agent for macOS

Aavirash Mitra

Aavirash Mitra

Kouto is an agentic voice agent for the Mac that I designed and built end to end. You hold a key and talk, and it answers out loud, runs your automations, sits in on meetings and makes you a podcast. No cloud, no API keys, no account.
Kouto, an agentic voice agent for macOS
Kouto, an agentic voice agent for macOS

The problem was presence, not features

Most voice assistants are chat boxes with a microphone bolted on. The interface is still a window full of text and the voice is a feature inside it. I wanted to find out what is left when you take the window away.
That leaves a hard constraint. A voice agent has no screen to point at: no list to scroll, no button to press, no cursor to follow. Everything the user knows about what is happening has to arrive through sound and one small object on screen, and in its smallest form there is nowhere to put text at all. So I wrote the constraint down first and designed against it, and the main screen has exactly one control.

Seven states, and none of them is a spinner

The sphere is the entire interface. It is a cloud of particles, and the state of the conversation changes both its colour and the way it moves. Every state is the real sphere, captured from the app's own renderer rather than recreated.
The Kouto orb across its states
The Kouto orb across its states

Latency is a design problem

A naive voice assistant waits for the whole reply, synthesises all of it, then plays it. You sit in silence while it composes an essay. That silence is the product experience, and it is terrible. Nothing about the shape of the reply changed here. What changed is when you hear the first word.
A voice turn drawn twice: sequential stages against overlapped ones
A voice turn drawn twice: sequential stages against overlapped ones

One machine, and nothing leaves it

Speech recognition, the model and the voice all run locally. That is not a privacy claim added at the end: an assistant that holds your calendar, your meetings and your notes is a different proposition when none of it leaves the machine, and it is the reason this product can exist at all.
Signal flow from microphone through the client and local model
Signal flow from microphone through the client and local model

A design system with a motion language in it

The app is styled by fifty-nine custom properties, and the reference sheet is generated by reading them out of the stylesheet at render time rather than being maintained by hand. That is deliberate. A design system page that is typed out by hand drifts the moment someone changes a value, and this one cannot.
Colour. The tokens are grouped by the job they do. Surfaces step up from the page ground through a soft panel to the raised surface, each with a matching border, plus a separate focus border for keyboard navigation. Text runs in three strengths, for primary, secondary and faint. A small semantic set carries meaning: mint for positive, amber for caution and danger for failure. Two more mark who is speaking, one tone for you and one for the agent.
The orb palette. The sphere carries its own five tokens per state: two ends of the particle gradient, a core colour for the additive particles drawn against it, a halo for the glow around the shape, and a flow colour for the classic sphere bands. The chequered entries on the sheet are the translucent ones. Five is the whole vocabulary, and it is declared once and identical in both themes, because the light theme overrides the sphere's shading and its core alpha rather than its hues. That is what lets the states be themed without a single branching condition, and it is why they hold together.
The states are idle, listening, speaking, transcribing, thinking and working, with a voiced variant on listening and a danger flash for errors.
Type. Sixteen sizes, from an 8px station dot up to a 46px lock clock, and each one is bound to a role rather than to a heading level. Body copy is 14px. Message bodies and the input are 13.5px, controls and selects are 13px, and the band the interface mostly lives in runs between 10.5 and 13, which is how the app reads as dense without reading as small.
Motion. Five named verbs, and the states are assembled from them rather than hand-animated one at a time.
The Kouto design system: colour tokens, type scale, and the per-state orb palette
The Kouto design system: colour tokens, type scale, and the per-state orb palette
The same system in the light theme
The same system in the light theme

What it still cannot do

There is no wake word, so it needs a key press before it listens. It does not transcribe while you are still speaking, so the transcript arrives after you finish rather than with you. And it does not keep a conversation across a restart.
Those three are the difference between an assistant you visit and one that is simply present. That is the part I have not solved.
Like this project

Posted Oct 13, 2026

An agentic voice agent that runs entirely on one Mac. Designed and built end to end with Design system & Branding.