From one Spanish deck to eighty-four languages

5001 WordsYiddishYiddish text-to-speechtext-to-speechlanguage learningvocabulary appspaced repetitionGerman for workPflegeKitaHandwerkoffline appsSwiftUIiOSAndroidAI-assisted developmentside projects

On 1 February this year I made three commits to an empty repository: initial version, v2, v3. I was learning Spanish — the same stretch that had already produced a five-minute timer four months earlier — I had tried Anki, and Anki is excellent. It is also, to my eye, punishing to look at. Spaced repetition is a solved problem; the interface was not the thing stopping me, but it was the thing I noticed every single day.

So I wrote my own. One deck, Spanish to English, on an iPhone.

The card view, as it looks in the store listing today.
The card view, as it looks in the store listing today.

Then nothing for four and a half months.

That gap is the part I would skip if I were selling this, and it is the part that matters. The app worked. I used it. I did not touch the code because there was nothing I wanted from it. Most side projects die there, and that is usually correct — the itch is scratched and the tool is done.

Audio, and then the second language

On 24 June I committed media and content. Reading a word is not learning a word; I wanted to hear it. Microsoft's edge-tts gives you neural voices for most major languages at no cost and with no licensing problem, so the deck gained pronunciation on both sides of the card.

Later the same day: second language. Then dutch sounds, dutch audio. Once audio existed, adding a language was mostly data, and the thing stopped being a Spanish app.

The plane

The next day I committed downloadable audio packages.

I had been on a flight, opened the app, and found it useless. The word lists were local but the audio was not, and a vocabulary app that cannot speak on a plane is a vocabulary app that cannot be used in exactly the dead time it was built for.

The fix is a single .pack file per language — word list plus every audio clip, between 55 and 280 MB depending on the language. The detail I am still pleased with is that the word list sits at the front of the file and is fetched with a range request, so you can start studying a few seconds after tapping download while the audio continues in the background. You do not wait for 200 MB to learn your first word.

A language a day

Then it ran away from me. Still 25 June: german, jiddish package, more languages, french, ukrainian. Nineteen commits that month, twenty-four in July, twenty-five in August.

Along the way the app grew an Apple Watch build with the full feature set, a home-screen widget, notifications, auto-play that speaks cards on a timer so you can study without hands, bidirectional decks with separate audio per direction, and a focus mode that drills a subset of what you have not learned. On 19 August: android initial version.

None of that was planned. Each piece existed because I wanted it on a particular day.

Pflege, Kita, Handwerk

The turn that made this more than a toy came from reading about people learning German for work.

Not German. German for work — and specifically the vocabulary of care homes, of childcare, of the trades. A nurse arriving from Romania does not need the subjunctive before she needs the word for a pressure sore. The general-purpose courses serve her badly, and the specialised material is thin and expensive.

So the app grew vocational tracks: Pflege (care), Kita (childcare), Handwerk (trades). Each paired with the languages the people doing those jobs actually arrive speaking — Arabic, Bulgarian, Polish, Romanian, Turkish, Ukrainian.

That pairing is the whole point. !A language page: the general deck first, then decks for specific jobs. This one is Italian.

German–English vocational decks already exist. German–Bulgarian care vocabulary, with audio, offline, free, on a phone — that is a gap, and it is a gap precisely because the people in it are not a lucrative market.

The language Google will translate but not speak

Yiddish broke the pattern.

Every other language in the app gets its audio from edge-tts, with espeak-ng filling in for Latin, Basque and Scottish Gaelic where no neural voice exists. For Yiddish there was nothing. Google Translate handles the text. It will not speak it. No major provider offers a Yiddish voice, because there is no commercial case for one.

A language written down since the thirteenth century, and you cannot make a computer say a word of it.

So I built the text-to-speech myself, wrapping pretrained FastSpeech2 checkpoints into something that takes Yiddish text and returns audio, then generating the deck's clips in batch. It is now a separate project, and the Yiddish deck ships bundled with the app rather than as a download.

This is the part of the whole story I would defend hardest. The app has 294 decks across 84 languages, and the ones that justify its existence are not the ones with the largest speaker counts.

Where the limit actually is

Nine months on, the constraint is not code and it is not my time. It is whether a language has a usable text-to-speech voice and a translation source good enough to trust.

Where both exist, a new deck is close to free. Where neither exists, as with Yiddish, it costs a side project of its own. That is a strange and rather cheering place to end up: the bottleneck on teaching a language is no longer software, it is whether anyone has bothered to build a voice for it.

On the machine that helped

I built nearly all of this alongside Claude, and I spent a fair amount of the time deliberately trying to find the edge of what it could do — the Watch target, the pack format, batching a TTS model I had just assembled, localising an interface into dozens of languages I do not read.

It kept up. That is not a small thing to say about nine months of work across two platforms, and it is also not the interesting part. The interesting part is that the decisions that made this app worth using — offline because of one flight, vocational German because of one article, Yiddish because nobody else would — were not technical decisions at all. The machine was very good at the half of the work that was.


5001 Words is free on the App Store and Google Play. The vocational decks have their own pages: Pflege, Kita, Handwerk.