Inspiration

  • Kana is the first step a Japanese learner needs: the reading and writing system. Unlike the English alphabet, there are 208 characters to memorise before you can start reading. Daunting as that sounds, a casual learner should be able to finish it in about two weeks, and that unlocks a lot of the menus and everyday signs a traveller runs into in Japan.
  • That beginner is the largest group of people who want to start learning Japanese, so we wanted every feature in the app to be free, with ads as our main source of revenue.

What we built

  • A sequential learning experience. The loop is simple: show new characters and their sounds, then quiz the learner in several different patterns so the memory sticks.
  • We scale the frequency and difficulty of those quizzes to how the learner is performing, for example by growing or shrinking the answer grid.
  • Free with ads; one purchase (RevenueCat) turns them off. Yearly $15.99, lifetime $24.99, no monthly — on an app you finish, lifetime is the honest offer.
  • We wanted a learning companion in the app, so we built a React Native tool for creating these characters and their in-app reactions. Once it is polished we plan to open source it.

The feel we wanted

We wanted a hand-drawn, illustrated feel, with a friendly interactive avatar. The home screen carries an illustrated animation in the spirit of the YouTube study-video trend. The app should feel cosy, and put the learner in the mood to study.

The companion

  • Built with @sovl/procedural-avatar, written for this and to be released MIT: https://github.com/jamesrjohnston/procedural-avatar (pending polish before we release)
    • Procedural, reactive characters for React Native. A character is data, its state is data — ten lines of JSON, eight primitive shapes, a roundness dial. No native code, one peer dep (react-native-svg), Expo Go compatible.
    • JSON-first means LLM-drivable: a model can author a character or drive its mood. spec/CHARACTER-DESIGN.md records building nine and scoring them.
  • Five moods, no more. Five companions: one from the start, one at a milestone, three bought with points earned by studying. Each is an identity plus a colour pair, so swapping the placeholder for the real thing changed no screen.

Audio

  • 208 sounds × two voices, generated with ElevenLabs eleven_multilingual_v2, then reviewed.
  • One clip per sound, not per glyph — あ and ア are the same syllable, and two recordings would teach that the scripts sound different. 416 clips → 208, 1.7 MB.
  • A small harness flags clips by duration and by ear; flagged ones are re-recorded by hand. Lesson: type the glyph, never the romaji — the model reads Latin letters as letter names.
  • A missing clip silently turns a listening question into a recognition one. The lesson never breaks.

How we built it

  • Expo 57, RevenueCat and AdMob. iOS and Android from one codebase, although a DUNS problem meant the Android and Galaxy versions did not make it out in time.
  • New tools in the AI space, ElevenLabs and Claude Code in particular, are what made this possible in the time we had.

Challenges

  • DUNS. Getting the business registered with the right details turned into a back and forth, and the Android version missed the deadline because of it.
  • Scope. We wanted more: a path map, matching questions, more companions. We cut screens, not progression, to ship. We also wanted an audio back and forth that drills the learner by anticipation, which is the ideal exercise for an app like this. We could not get it to that level in time, but the groundwork for it is in place.

What's next

  • Path map, more companions buyable with points, matching questions.
  • Open @sovl/procedural-avatar properly — docs, examples, the LLM authoring flow.
  • Not kanji. Reading real words with the kana you have.

Built With

Share this project:

Updates

Submission history