Case study · Android

We could have told you we build Android apps. Instead, we shipped one.

Kudenia is an offline-first vocabulary app for people learning English. We designed it, wrote it in Kotlin, and took it through Google Play ourselves. It is live in 177 countries and regions — you can install it before you finish reading this page.

See the live app on Google Play
The Kudenia store graphic: the app name, the tagline Words that actually stay, and a review card asking the reader to type a word from its definition.
Why we built it

A portfolio you can install.

Any studio can put a phone mockup on a slide. We wanted something a client could install on the way to the meeting.

So we picked the version of the job with nowhere to hide: fully offline. No account, no server, no analytics. Nothing to defer to a backend, nothing to quietly fix after launch. If it works, it works on the device — and every decision about how it behaves had to be made in the app and defended there.

What we built

Built like a product, not a demo.

1,836words, A1–C2
Kotlin+ Jetpack Compose
724automated tests
177countries & regions
0servers

Kudenia teaches English vocabulary eight words at a time, in sessions of about three minutes. It ships with 1,836 words spanning A1 to C2 — each with a definition, an example sentence and pronunciation that still works in airplane mode.

Underneath: native Kotlin, a Jetpack Compose interface, and six Gradle modules so the learning engine can be tested without an emulator. 724 automated tests cover it — 551 on every push, and the 173 that need real hardware every night. Free, in the Education category, with all ten of Google's content declarations answered in-house.

How it works

Three decisions we had to defend.

  1. 01

    Recognition once. Recall after that.

    The first time you meet a word, it is multiple choice. Every time after that you type it yourself, from a definition and a sentence with the word cut out. Recognising a word is not knowing it, and the app refuses to pretend otherwise.

    A new word shown as four options under a definition and a sentence with the word blanked out. The same word on a later session, now typed into an empty field from its definition.
  2. 02

    It speaks with the network off.

    Tap the word on the reveal card and it is spoken in a US or UK accent, generated on the device itself. No network call. No per-play cost. It works on a plane.

    The reveal card after a correct answer, showing the word, its definition and a speaker control.
  3. 03

    "Learned" has to mean something.

    A word counts as learned only after six correct unaided recalls in a row — the last two separated by three weeks and two months. It is a slower number than other apps report. It is also one we can defend.

    The word list, each entry showing how far through the learning schedule it is.
What we learned

Three things we would tell a client on day one.

  • 01
    Shipping is mostly paperwork
    The build was the shorter half. Ten content declarations, an IARC rating, a data-safety form and a privacy policy stand between a finished app and a published one.
  • 02
    Name it for the lawyer, not the search engine
    Our first name described exactly what the app did. It was also already in use as another app's subtitle. A coined name is harder to search for and far harder to lose.
  • 03
    Approved is not published
    With managed publishing on, Google approving a release changes nothing until someone presses a button. Ours sat approved and invisible overnight. Twice.