← All work
00 / Say It · Voice product · 2026 Live · built on ElevenLabs Agents

1,000 days on Duolingo. Still couldn't order a beer.

A streak that long is supposed to mean something. Mine meant I was very good at tapping the right tile. Put me in front of an actual German person and nothing came out. Say It is what I built instead: thirty phrases worth actually saying, drilled out loud against a voice agent, built for one trip with a real date on it.

The Say It app: a dark orb centred on a white page, with the line 80 days to Berlin, Speak German before you land, and a Start warm-up button
Live at say-it-nu.vercel.app · the countdown is real, Berlin, October 2026.
Try the live demo →
01 / The diagnosis

The streak was measuring the wrong thing.

Nearly three years of daily practice, and the failure was total the moment it mattered. That is not a discipline problem, I had the discipline. It is a design problem, and once I named it properly the whole product fell out of it.

Phrasebooks and mainstream apps optimise recognition, not production. The failure moment is saying a phrase out loud, at speed, to a real person. Nothing cheap rehearses that moment.

From the scoping doc

Recognition is picking the right answer from four. Production is opening your mouth with someone waiting. They feel like the same skill. They are not, which is how a thousand-day streak sits happily alongside total silence at the bar. Every tap I made trained the easy one.

The other thing the streak hid: most of what I learned was never going to come up. I can tell you, in German, that the turtle drinks milk. I could not ask where the toilets were. Duolingo optimises for the next lesson, not for the trip, so the vocabulary is broad, evenly spread and almost entirely irrelevant to any actual evening.

Three years bought me comprehension. I can read a menu. I cannot talk to the person holding it. That is a real skill and it is not the one I was paying for.

Then there is the bill. I paid a subscription for the better part of three years in order to arrive at the bar unable to speak. Not a scam, the product does exactly what it advertises. But the price and the outcome were never connected: I was billed for continuing, not for arriving. A streak is a retention mechanic wearing the costume of an achievement, and it charges monthly whether or not you can order a beer.

Say It cost a few pounds of API credit, because generation is priced per use. That inverts the incentive completely. A subscription wants you back tomorrow. A per-use tool wants to be finished with you. I would rather build the thing that gets me to Berlin and then goes quiet.

The reframe

Stop trying to learn a language. Start trying to survive four specific days, in one specific city, with about thirty things you will genuinely need to say. Narrow the target until practice can't miss.

02 / The pack

Thirty phrases. Personality over phrasebook.

The content is the product. Thirty phrases across arrival, food, directions, emergency and nightlife, chosen because you would actually say them in Berlin, not because they come next in a syllabus.

Nightlife · the hero phrase
Wo ist die Tanzfläche?
Where is the dance floor?
voh ist dee TANTS-fleh-khuh
Nightlife
Wie komme ich ins Berghain?
How do I get into Berghain?
vee KOM-uh ikh ins bairg-HINE
Food
Das war lecker!
That was delicious!
das var LECK-er
Nightlife
Noch eine Runde!
Another round!
nokh INE-uh ROON-duh
Directions
Ich habe mich verlaufen.
I'm lost.
ikh HAH-buh mikh fair-LOW-fen
Survival
Langsamer, bitte.
Slower, please.
LANG-zah-mer, BIT-uh

Funny is a memory mechanism, not decoration. "Wo ist die Tanzfläche?" sticks because it is faintly ridiculous to practise and genuinely useful at 2am. Asking how to get into Berghain is a joke with a real answer. A phrase you enjoy saying gets said fifty more times than one you dutifully repeat. So the pack is written to be fun first, and the fun does the job the streak was only pretending to do.

Each phrase carries three things and only three: the German, the English, and a phonetic hint written for an English mouth rather than in IPA. TANTS-fleh-khuh is not correct notation. It is correct enough to get the sound out, which is the only job it has.

03 / The loop

Three outcomes, and none of them is failure.

The agent says the phrase at native speed, then slowly. The card shows it. You say it back. What happens next is the entire product, and there are exactly three things that can happen.

Advance

Good enough

Brief praise, varied so it never sounds canned, and straight on to the next phrase.

Correct

Close

Name the one thing to fix, replay just that sound, invite a retry. Two attempts, never more.

Rescue

Way off

Re-model slowly, tag it shaky, and advance anyway with encouragement. Tomorrow it comes back first.

Progress is never blocked. That is the one rule the whole design hangs on. The failure mode of language apps is the wall, the thing that will not let you past until you get it right, which for a nervous speaker is precisely when they close the tab. Say It always moves forward and quietly remembers what wobbled.

The worst moment, designed for

The drop-off is not lesson four. It is the first phrase said out loud, because talking to a computer feels ridiculous. So the orb speaks first and sounds like a mate rather than an examiner, phrase one is trivially easy, and the funniest phrase in the pack lands inside the first session as a reward.

04 / What went wrong

The first build opened with a wall of German.

The agent had no fixed first message, so it improvised, in German, at length, with no card on screen. A beginner's first experience was a paragraph of a language they did not speak and nothing to read. It was the exact anxiety the product exists to remove, delivered in the first four seconds.

Design document comparing what went wrong - the German wall, empty first message, card appearing too late - against the fix: a deterministic English opening, card first, one line of coaching
The teardown · three faults, three levers.

The fix was three rules, all of them about taking improvisation away from the model at the moments that matter. A deterministic English opening, spoken identically every time, explaining the loop in one breath: I show it, I say it, you say it back. Card before voice, a hard rule that the phrase must be on screen before the agent speaks it. And English coaching only, with German reserved for the phrase itself.

Seven storyboard frames showing the corrected session: idle with countdown, greeting in English, phrase shown, your turn listening, and onward
The corrected session, frame by frame.

The useful part: the model was not wrong, the brief was. Given room to improvise at the highest-stakes moment in the experience, it improvised. Deciding where a model is allowed to be creative is most of the work in shipping anything voice-based.

05 / Deletions

What I took out, and why.

More was cut than built. Each of these was in the first plan and each one earned its removal.

✕ Killed

The 10,000 hours ladder

Mastery folklore aimed at the wrong person. Nobody habit-builds toward ten thousand hours for a long weekend. The trip date is a better mechanic than any streak: a real deadline, intrinsic motivation, and a natural end.

✕ Killed

XP, leagues and badges

The machinery that gave me a thousand hollow days. Kept exactly two numbers: the day streak and "X days to Berlin". Everything else was rewarding the wrong behaviour.

✕ Killed

Phoneme-level scoring

A real pronunciation pipeline is a week's work on its own. The agent saying "close, the ch in ich is softer" is enough to be useful, and honest about being a judgement rather than a score.

✕ Killed

Accounts, payments, more languages

One page, one language pair, one trip. Every one of these would have made it look more like a product and less like a working thing.

The pattern is the same one that made the streak worthless: reward something other than the outcome you want, and you get that other thing every time. Duolingo's leagues made me a person with a streak. A countdown to a real flight makes me a person who can order a beer.

06 / Where it goes

A pack is thirty lines. That's the whole point.

The thing I actually want out of this is not an app. It is a format my friends can take and make their own, because the reason the Berlin pack works is that it was written by someone going to Berlin.

The unit
A pack: a city, a date, and about thirty phrases with a phonetic hint each. Plain data, roughly thirty lines. No CMS, no schema ceremony.
Forking it
Someone flying to Lisbon copies the file, swaps the phrases for the ones they will need, sets their own date. The drill loop, the agent and the coaching rules are untouched.
Why it improves
Packs get better by being used and edited, not by a syllabus committee. The funniest, most useful phrases survive because people keep the ones they enjoy saying.
Still to build
Sharing a pack by link, a friends-and-trips view, and letting the agent suggest phrases from a described trip so writing one takes minutes rather than an evening.

There is a version of this that is a real business, and it is not this one. Voice language tutoring is a crowded market, and Speak is already in it at around a billion dollars. If it were ever worth pursuing, the angle would be the deadline. Everyone else sells open-ended learning you subscribe to. This is a three-week product that finishes.

What this was actually for

Say It was built as proof of work for an ElevenLabs application, an argument, in the form of a working thing, that I can take their stack and produce something finished and teachable rather than a demo that falls over.

The Duolingo streak is genuinely why it exists though. I wanted the thousand days back, and failing that, I wanted the next eighty to count.

Try the live demo →