Lexborn: stop studying, start speaking
Voice practice for English speakers learning another language. Seven languages, three personas each, memory that survives the session, and flashcards built from the words you couldn't say.

Context
Lexborn is voice practice for English speakers learning another language. Seven target languages, three personas in each, and a conversation that picks up where the last one ended instead of introducing itself again.
What makes it different from a chatbot with a microphone is memory. The partner remembers what you talked about last Tuesday, remembers that you keep dodging the past tense, and remembers the words you reached for and could not find. Those words become your flashcards, on a spaced repetition schedule, without you opening a deck editor.
It is pre-launch. More on that below, because the reason is embarrassing.
The problem
I have used the apps. I have a streak in one of them measured in hundreds of days and I cannot order lunch.
The gap is not knowledge. Every mainstream language app is a tapping game, and tapping the correct tile out of four is a different motor and cognitive act from producing a sentence out loud, in real time, while someone waits. You can be excellent at the first and mute at the second, and the app will keep congratulating you either way.
The honest alternative is a tutor, which costs money and requires calendars. The gap between a free tapping game and a scheduled human is where almost everyone learning a language lives.
My role
Everything, solo. Nuits has never hired anyone.
Product, interface, brand, the voice loop, the memory layer, the flashcard scheduler, the persona pipeline, auth, billing. Also the decision about what the personas may correct and when, which sounds like a content question and is really the core product decision.
Approach
The design question was interruption. A partner who fixes every error is unbearable and makes you stop talking, which is the failure the product exists to prevent. A partner who fixes nothing is pleasant and useless.
I settled on deferred correction. During the conversation the partner keeps the exchange alive and only intervenes when a mistake blocks comprehension. Everything else is logged silently. Afterwards you get the corrections in one pass, grouped, with the sentence you said next to the sentence you meant. The flow stays intact and the feedback still arrives.
The three personas per language exist for the same reason. They differ in patience, speed and register, so a beginner is not dropped into a fast colloquial speaker on day one and an intermediate learner is not stuck with someone who talks to them like a child.
Building it
Next.js with Turbopack. Clerk handles authentication, Polar handles payments as merchant of record, which for a Finnish sole trader selling into the EU is the difference between shipping and doing VAT registrations forever.
The voice loop is where the engineering is. A realtime speech-to-speech path keeps the round trip low enough that the pause after you stop talking feels like a person thinking rather than a server working. Above roughly a second it reads as lag and people start over-articulating, which changes what they say. Streaming both directions, and starting playback on the first audio chunk rather than the last, buys that back.
The memory layer is separate from the conversation. After each session a summarisation pass extracts durable facts about the learner (topics covered, grammar attempted, recurring errors, vocabulary gaps) and writes them to a profile. The next session injects a compact version of that profile rather than raw transcript history. This is a cost decision as much as a quality one: replaying full transcripts into every prompt grows without bound, and a model given fifty sessions of raw history ignores the middle anyway.
The flashcard scheduler reads the vocabulary gaps directly. If you paused, said the English word, or circled a concept for three clauses, that item enters the deck. Spaced repetition schedules it, and using the word successfully in a later conversation counts as a review, so speaking the language is itself the study session.
The persona pipeline generates and validates each character’s voice, register and correction threshold per language, so adding an eighth language is a data task rather than an engineering one.
Failure modes, honestly: speech recognition on a heavy accent in a language you barely speak is the hardest input in the product, and it degrades exactly when the learner is most fragile. Background noise gets read as speech and interrupts the partner. A memory layer that remembers a wrong fact about you is worse than no memory, so profile entries carry confidence and decay if never confirmed again.
Outcome
It is not launched. The site is up, the product works, and it still ships a Clerk pk_test_ publishable key in production, which means the auth environment is a test instance. That is a launch blocker of my own making, it is on the list, and pretending otherwise would sit badly next to a portfolio full of products that disclose their own limits.
What I’d do differently
I built the persona pipeline for seven languages before validating that one language was good. Six waited months to be used, and the effort should have gone into the voice loop.
I would also have wired environment keys through a checked configuration at the start. A test key surviving into production is not a hard bug. It is the kind of thing you only catch with a check that fails the build, and I did not write one.




