Doch: Brief it in English, it calls in German

A live voice agent that phones German businesses for English speakers, and checks with you when something isn't in the plan.

01

Problem

A lot of life in Germany still runs through the phone: the Hausverwaltung, the doctor's practice, the insurer. Emails and chats go through a translator. A phone call can't, so people who don't speak German put it off or hand it to someone else.

02

What I did

Designed and built it alone in five weeks with Claude Code: two voice agents on Claude, calls placed from your own mobile number, a Next.js app and a design system of its own. Then I pointed it at 35 real German businesses.

03

Result

The tech held: about 0.8 seconds per model reply, and Doch held the line twice to ask me something. Trust didn't. Of 26 people who picked up, most hung up at the moment Doch said it was an AI. Four stayed to answer.

RoleSolo designer and builder
TimelineFive weeks, Sep to Oct 2026
ScopeResearch to a live app and 35 real calls

Businesses called

35

35

Stayed to answer after the AI line

4/26

4/26

Model reply time

~0.8 s

~0.8 s

Eval situations

41

41

Real calls on 15, 23 and 30 October 2026, picked by hand and logged from the agent's own transcripts. Reply time is the model's median across 31 replies on ten calls, not the silence a person hears. Small sample, read as directional.

The product

One designer. Two agents. Real calls.

You brief Doch in English, by voice. It turns your answers into a plan you check before it dials: who it's calling, why, which times it can agree to, and what it will and won't share. Then it calls the business in German from your own mobile number, with live English captions as it goes.

If something comes up that isn't in the plan, Doch says “Einen Moment bitte”, holds the line and asks you on screen. Afterwards you get a report of what was agreed and what was shared about you.

Watch a real call to a Berlin bike shop, from briefing to report. The briefing runs at double speed and the call in real time. Screen recording, no call audio.

Doch's plan screen in the first prototype: who it's calling, why, what it can agree to, and what it will and won't share.

Context

A call I kept putting off

I've lived in Berlin since 2016 and I still put off phone calls in German. The other person speeds up, I lose the thread, and they wait while I reach for a translator app. A lot of life here still runs through the phone: the Hausverwaltung, the doctor's practice, the insurer.

So I built Doch, named after what Germans say when they mean “on the contrary”. “I can't make this call in German.” Doch. You brief it in English, it calls the business in German, it checks with you if something comes up you didn't cover, and it tells you what was agreed.

It was also the hardest version of the trust problem I'd met on Roam: an agent that speaks for you, to a stranger, in a language you can't follow. So I designed it around six moments where people stop trusting an agent, and tested them on real calls.

Design decisions

Four decisions that shaped Doch

01

Designing what it says no to

The first test call broke three rules while trying to help: it offered to search for a doctor, noted a slot after 8 pm and asked for a date of birth out loud. Now Doch calls only the number you give it, weekdays 8:00 to 18:00, and never says private details aloud. 41 written situations test each rule.

02

No take-over button

The prototype had a “Take over the call” button. I cut it: if you could follow the German, you wouldn't need Doch. Instead the agent calls an ask_user tool, Doch says “Einen Moment bitte”, and a Needs you sheet slides up with the question in English and answers to tap.

03

Captions, because I couldn't follow my own call

Testing the German agent myself, I hung up because I couldn't follow it. That's every Doch user. So the live screen shows each line in English as it's said, with the German underneath, and the background glows in the colour of whoever is speaking.

04

Two Voices, a design system of its own

Teal is always the business, coral is always Doch, and you're neutral, so you can tell who's speaking at a glance. Primitives feed semantic tokens named by role, so when Doch stopped sharing your colour I re-pointed a handful of tokens instead of every component.

Doch's user flow: briefing in English, the plan you check, the German call with live captions, the Needs you sheet, and the report.
Doch's user flow: briefing in English, the plan you check, the German call with live captions, the Needs you sheet, and the report.

Trust moments

Six moments where trust breaks

I designed Doch around six moments where people stop trusting an agent, and built each one in. On real calls, trust broke somewhere else: at the moment Doch said it was an AI.

The first user flow, with the trust moments marked in coral on the screens they belong to. Take-over was cut a week later.
Status Moment In Doch
01 Tested Confidence and escalation When something isn't in the plan, Doch says “Einen Moment bitte” and asks you on screen. It held the line twice on real calls.
02 Built Explainable rationale The report says why Doch made each choice, like taking Thursday because you said weekday mornings. Not tested with users.
03 Built Intent preview and autonomy Before it dials, you see the plan: who, why, which times it can agree to, what it will share. Both testers read it closely.
04 Built Action audit and undo A report of what was agreed and what was shared about you. A call can’t be undone, so the preview carries more weight. Rewritten after it said “Call finished” when nothing was agreed.
05 Partly Latency About 0.8 seconds per model reply. The silence a person actually hears isn't measured yet.
06 Not yet Interruption No take-over by design. You answer Doch's questions, you never join the call. Not properly tested.

Design system

Two Voices: who's speaking, at a glance

A Doch call has three participants and only two voices on the line: the business in German, and Doch speaking for you. You're watching from your phone, usually without following the German, so the screen has to tell you who's speaking without a label. I built the system in one morning with Claude, on the components Doch already had.

Choosing the pair

I tested three token sets on the same three screens, each with a colour per speaker. Warm sand's terracotta and olive nearly merge for red-green colour blindness. Head office separated best but felt like the institutions you're calling. Teal and coral won: warm for your side, cool for theirs, 180° apart, so where the call screen's glows meet they fade to off-white, not brown.

Doch | Design Tokens

Two Voices · visual token reference
Colour primitives
Teal scale · the business
teal.50#F4F9FA
teal.100#E9F4F7
teal.200#CAE7EC
teal.300#9FD4DF
teal.400#59BBCF
teal.500#2790A5
teal.600#1D798C
teal.700#156575
teal.800#0E4B58
teal.900#09323A
Coral scale · Doch
coral.50#FEF3F0
coral.100#FEEBE7
coral.200#FCD2CA
coral.300#F7AFA1
coral.400#EC6E55
coral.500#DA4B2F
coral.600#A5341D
coral.700#842815
coral.800#621C0F
coral.900#3F1209
Warm neutrals · you
canvas#FAF7F2
surface#FFFFFF
chip#F1ECE5
muted#6B635A
ink#1F1B17
Semantic aliases · use these in components, never the primitives
theirteal.500 · #2790A5 · the business's voice
their.softteal.100 · #E9F4F7 · their bubble
yourscoral.400 · #EC6E55 · Doch's voice
yours.softcoral.100 · #FEEBE7 · Doch's bubble
primary#C34228 · main action, Make the call
live#2E8A55 · Live, Dialling, Answered
need#E0A21F · Needs you
error#C8102E · about 5:1 on canvas
Type
Bricolage GrotesqueHeadings · 500
FigtreeText and UI · 400 to 600
Shape
pill · 999
card · 18
sheet · 28

Tokens, then components

Each colour became a ten-step primitive scale. Components never touch the primitives; they point at semantic tokens named by role, like the business's bubble and Doch's bubble, which live as CSS custom properties in one stylesheet. Badges take their tone from their label, and the error red holds about 5:1 on the app's backgrounds.

The Doch component library: actions, badges, chips, the live call with a bubble per speaker, the Needs you sheet, the briefing orb, a field error and the tab bar.
The Doch component library: actions, badges, chips, the live call with a bubble per speaker, the Needs you sheet, the briefing orb, a field error and the tab bar.

The token reference on the left, and the component library it feeds on the right, from colour primitives through to finished buttons, cards and badges.

The token reference on top, and the component library it feeds below it, from colour primitives through to finished buttons, cards and badges.

Tokens and components, straight to code

The same pipeline, traced through two components. The Needs you badge follows a status colour, Doch's bubble follows a role. Each time, the value set in the design system is the exact token the shipped CSS renders from.

Figma · Design System
Needs you
StatusPill · Tone = need
Fill#FCEBC4
Dot#E0A21F
Text#5E4206
Radius999

The Needs you badge. Its colours live in the design system, not on the component.

doch.css · tokens
/* Status: needs you */
--need: #E0A21F;
--need-text: #5E4206;
--need-soft: #FCEBC4;

Each colour is one named token, the only place the raw hex is written.

doch.css · components
.tone-need {
background: var(--need-soft);
color: var(--need-text);
--dot: var(--need);
}

The badge picks its tone from its label, so a new status can't end up the wrong colour.

Figma · Design System
Doch
May I ask a quick question?
Darf ich kurz eine Frage stellen?
CaptionLine · speaker = Doch
Fill#FEEBE7
Label#A5341D
Radius18

Doch's line on the live call. It takes Doch's colour on every screen, never yours.

doch.css · tokens
/* Primitive */
--coral-100: #FEEBE7;
/* Role */
--yours-soft:
var(--coral-100);
--yours-text:
var(--coral-600);

Role tokens point at primitives. When Doch stopped sharing your colour, only these lines changed.

doch.css · components
.caption-line.doch {
background:
  var(--yours-soft);
border-radius: 18px;
align-self: flex-end;
}

The bubble asks for the role, not the colour. Doch sits on the right, the business on the left.

User testing

What 35 real calls taught me

Two expats ran a real errand of their own on the working app, in moderated sessions on 15 and 16 October. Then I pointed Doch at 35 real German businesses: pharmacies, bike shops, hotels, nail salons, a florist. The tech held. Trust broke somewhere I hadn't designed for.

Method

Moderated sessions with two testers on the working app. Then 35 calls I placed myself on 15, 23 and 30 October, logged from the agent's own transcripts.

Task

Testers: an errand of their own they'd been putting off. Calls: a short, simple request to a small business, the kind of call an expat puts off.

Participants

Two expats living in Berlin. Then 35 businesses I picked by hand: pharmacies, bike shops, hotels, nail salons and a florist.

Measures

Who picked up, who stayed past the AI line, when they hung up, and whether the call got an answer. Small sample, read as directional.

Of 35 calls, 26 had a person pick up. Four of them stayed on the line long enough to answer Doch's question.

35

35

real businesses called

26

26

had a person pick up the phone

4

4

stayed on the line and answered

2

2

times Doch held the line to ask me

What I found

01

The stress moved, it didn't go away

Neither tester's call went through. One AI line went into a queue recording, then the report said “Call finished” when nothing was agreed. Watching the call brought back the same anxiety as making it.

02

Trust broke at the AI line

Doch has to say it's an AI (EU AI Act, Article 50). Of 26 people who picked up, 14 hung up during that line and 3 more at the check question before it, mostly two to six seconds in.

03

Rewording the opening barely helped

1 of 8 people stayed before I changed the opening, 3 of 15 after. The check question meant to catch wrong numbers caught one, while 3 of 6 people hung up on it. A safeguard became a second gate.

04

When Doch had to ask me, it worked

At Honigmond Hotel the person asked for the request by email. Doch held the line, the Needs you sheet came up, and I answered nine seconds into a 30-second countdown. Both business voice assistants it met just worked.

From 35 calls to 4 conversations

The biggest drop is at the AI line. Most hang-ups came faster than the line itself, so I suspect people react to the voice or the unknown number before the words land.

Funnel of the 35 calls: 26 picked up by a person, most hung up at or just before the AI line, 4 stayed on the line.

The four who stayed

They were small, local places with a one-sentence answer to give, like the Berlin bike shop in the video near the top. And when a business's own voice assistant picked up, both times the call just worked. The friction sits on the human side, at the moment someone learns they're talking to a machine.

The line every call has to pass

„Ich bin die digitale Sprachassistentin von Herrn Ahmed. Darf ich kurz eine Frage stellen?“

Doch, right after the business confirms its name. “I’m Mr Ahmed’s digital voice assistant. May I ask a quick question?”

Left: Doch on a live call to a Berlin bike shop, with English captions over the German. Right: the Needs you sheet during the Honigmond Hotel call.

Reflection

What a month of calls taught me

The tech works. Trust is the unsolved part

Replies came in under a second, the hold worked and the plan held. None of that matters if the person hangs up in the first six seconds.

Disclosure is the front door

Every trust moment I designed sits behind one sentence the law requires. That sentence is now the design problem, not the screens after it.

A safeguard can become a gate

The check question was there to protect the call. It cost more people than it saved. Every step added to the opening has to earn its seconds.

A report has to be honest about failure

“Call finished” over a call where nothing was agreed is worse than no report. The audit trail is only useful if it says when things went wrong.

Next steps

What comes next

35 calls picked by hand is a small sample. Next I'd listen to the first six seconds of every hang-up to separate the voice from the words, test whether a human reason before the AI line keeps people on (within what the law allows), and measure the silence a person actually hears. Then the calls that matter most: a real booking, and how long a receptionist will hold.

If you run a small business in Germany and an AI has ever called you, I'd like to know what you'd have wanted it to say first.