jamstack.consulting
Subscribe →

[ Ultravox · product front end · 2025 ]

A year of building the UI for a voice AI platform.

For most of 2025 I owned the product front end at Ultravox, a platform for real-time voice agents. This is the story of that year, told from the commit history.

The Ultravox agent builder interface Levi built
  1. Chapter 01 · Jan to Mar

    Make the console tell the truth about a call

    A voice agent is only as good as your ability to see what it did. The first months went into the React console: call records, call stages, voices, tools, and the schema changes underneath them, so a person debugging an agent could read exactly what happened in a conversation.

  2. Chapter 02 · Apr to Jun

    Agents, knowledge, and a URL you can share

    Then the pieces you build an agent from: create, list, edit, call history per agent, and knowledge sources you upload documents into. Filters and pagination moved into the URL so a filtered view of call history survives the back button and can be pasted to a teammate. Audio playback got the unglamorous work of byte ranges and Safari's opinions about them.

  3. Chapter 03 · Jul to Sep

    An agent builder you use by talking to an agent

    The headline piece. Instead of filling in a long form, you describe the agent you want and a builder agent drafts the prompt, streams its changes as a diff you can accept or edit, and lets you start a live test call without leaving the page. Most of the work was in the seams: switching between text and voice, muting mid-call, keeping the transcript in sync, and saving without losing a thought.

  4. Chapter 04 · Oct to Dec

    Show the tools working

    Agents call tools, and people need to see those calls. The last stretch surfaced tool activity and results in the conversation, made tool errors readable, and tightened the tool and voice forms that everything else depends on.

The stack

React and TypeScript on Vite, Tailwind, React Router. Data through generated OpenAPI types and SWR. Forms with TanStack Form and Zod. Monaco for prompt editing. Real-time voice through the Ultravox client.

What I'd bring to your team

Debuggability is the product.
Every hour spent making a call legible paid back in every later feature.
Put state where people can share it.
A URL is the cheapest collaboration feature there is.
The hard part of voice UI is the transitions.
Starting, muting, switching modes and ending cleanly took longer than any screen.
Ship in slices.
1,384 commits is what a year of small, reviewable steps looks like.

Want this kind of work on your product?

Not ready to subscribe? The 60-minute session is credited toward your first month if you subscribe within 30 days.