From AI voice agent prototype to a working app in a week

Week two of building Doch

14 Oct 2026

A week after the clickable prototype, Doch became a working app. This post is about that jump: what changed between an AI voice agent prototype that only clicked through screens and an app that rings a real phone, speaks German and keeps me in the loop.

The AI voice agent prototype, making a real call

The property manager in the demo, Hausverwaltung Krüger, isn’t a real business, and a friend played the person on the phone. I tell Doch in English what's wrong: the window in the stairwell is broken, there's glass and feathers everywhere, and it's a safety risk.

Doch asks me a couple of questions, then calls in German. I follow along in live English captions. By the end, a technician is booked for Thursday 15 October at 15:00, and I get a summary of what was agreed.

The plan comes first

Before it dials, Doch shows its plan: who it's calling and how you're connected (in the demo, a tenant for two years), why, which times it can agree to (tomorrow, or Friday after 2 pm), what to do if neither works, and what to say if they ask why you aren't calling yourself. Underneath it all is a hard limit: never outside Monday to Friday, 8:00 to 18:00.

This is the intent preview. Everything the briefing agent learned becomes structured fields, passed to the German agent as dynamic variables. The call agent works from the same plan you see, so if something’s wrong, you fix it before the call, not after a stranger has agreed to it.

Doch's plan sheet before a call to a property manager, listing the connection, reason, times it can agree to and what to say if asked why you aren't calling

The plan for the demo call. The German agent works from the same plan.

Live captions, because I couldn't follow my own call

On 8 October I tested the German call agent by playing the receptionist myself. I ended the call early because I couldn't follow the German. That's the position every Doch user is in. They hand the call over precisely because they can't follow it.

So the live call screen shows each line in English as it's said, with the German underneath. ElevenLabs' live monitoring, which would have streamed the transcript, is Enterprise only. Instead, my server places the call through Twilio and hands the audio to the German agent, while Twilio transcribes both sides in real time. Each line is translated and sent to the browser. The first proof, on 12 October, kept up.

When it doesn't know, it asks

Mid-call, the property manager asked: "Federn? Ist der Vogel noch drin?" Feathers? Is the bird still in there? That wasn't in my brief. The first test call had shown me that a helpful agent fills a gap like that with a confident guess. So Doch doesn't.

Doch's live call screen with each line in English and German, ending with the property manager asking whether the bird is still inside

The demo call, live. English on top, German underneath, and a question nobody briefed it for.

An early version of Doch's Needs you sheet asking whether to share a date of birth, with a take-over button that was later removed

An early Needs you sheet, still with "Take over the call". That button came out the same day.

It says "Einen Moment bitte" and keeps them on the line. Behind that line, the German agent makes a tool call, ask_user, which reaches my server as a webhook and shows up in the app. A sheet slides up over the live call with the question in English and three answers to tap, or I can hold and speak. I tap "No, it's gone", the answer goes back to the agent, and it carries on in German.

The ask_user tool's fields: a 30 second timeout, a holding line, the call ID, and the question in English and German with answer options.

The ask_user tool definition. The agent sends the question in English and German, plus answer options.

The prototype had a "Take over the call" button on the live screen. I dropped it on 12 October. If you could follow the German, you wouldn't need Doch, so jumping into the call isn't a real option for the people it's for. The "Needs you" sheet keeps you in charge without asking you to speak German.

The design question that's left is when to interrupt. Too often, and you might as well make the call yourself. Too rarely, and it agrees to things you never would.

Building with Claude Code

I'm a designer, and I don't hand-write the code. Building with Claude Code meant describing what each screen and rule should do, reviewing what it wrote, testing on a real phone and pushing the changes myself.

Two infrastructure details made a visible difference. The Vercel functions run in Frankfurt, because the default US region added a round trip across the Atlantic to every caption and every question. And every call goes out from the user's own verified mobile number, so if the business calls back, it reaches the person the appointment is for.

By the evening of 14 October the app was live at doch.akberahmed.com and worked end to end on my own phone.

What came next

The app worked, but it still looked like a prototype. Next, Doch gets a design system of its own.

Akber Ahmed is a senior product designer in Berlin, designing and building AI products. See more of his work at akberahmed.com/projects.

Doch build log
01Designing AI agents: what they say no toWeek one · 7 Oct
02AI voice agent prototype to working app in a weekWeek two · 14 OctYou're hereYou're here
03Two Voices: a design system for an AI appWeek three · 21 Oct04I made 35 phone calls in German. Four people stayed on the line.Week four · 30 Oct