Case 05 · Mobile app with conversational AI

An AI English tutor that remembers who you are

Open Fluent is an app for practicing English by talking with an AI tutor. It remembers what you tell it and the mistakes you keep making, but it only saves what you approve. It's in private beta, invite only.

Flutter · NestJS · voz en el teléfono · varios modelos de IA
2
layers of tutor memory
852
automated tests on the server

The client’s problem

Getting comfortable in English takes speaking every day, and the popular apps teach vocabulary without ever holding a conversation. Generic AI tutors do talk, but they forget everything when the session ends: they don’t know what happened to you yesterday or that you always trip over the same verb tense.

Open Fluent is for a closed group of friends who speak Spanish or Portuguese: two 10-minute sessions a day with a tutor that remembers them, plus streaks and a leaderboard to keep them coming back. The project’s rule was to spend as little as possible on AI.

How it works

  1. Speak. The app recognizes speech and reads replies out loud using the phone’s built-in engine. That way the most-used part costs nothing.
  2. Reply. The server sends the conversation to an AI model and gets back the reply along with corrections. There are two plans: the free one uses a chain of four free models and moves to the next one if a model fails; the paid one uses faster models.
  3. Remember. At the end of each session, a single AI call produces two things. One is a list of dated personal details (“has a job interview on Friday”) that stay pending until the user confirms or dismisses them. The other is a short note for the tutor with the mistakes that come up most, which the user can edit or delete. Only what’s been confirmed goes into the next conversation.

To choose models we set an entry bar: 20 test turns with planted mistakes, and a model only gets in if it returns well-formed replies 95% of the time and responds in under 8 seconds in 90% of cases. For now, the current models were picked through manual measurements; the automated test hasn’t been run yet.

The tough call and why

From “bring your own key” to our own plans. At first each user connected their own AI account, so the project paid nothing. In practice, that step scared off almost everyone before their first conversation. We replaced it with our own model router, with a free plan and a paid one. We decided against keeping both options because it doubled the work and still left the friction in place.

Flexible replies over a strict format. Asking the AI for a rigid format guarantees clean replies, but the free models won’t accept that mode. We went with a looser format and automatic repair for replies that come back malformed.

No automatic retries. Stacking the library’s retries on top of the router’s left users sitting in silence for over a minute. In a voice conversation, it’s better to fail fast and move on to the next model.

What broke along the way

  • The tutor remembered nothing. There were zero saved memories in the entire database. If a single detail was missing its date, the whole session’s memory got thrown out. Now only the invalid detail is dropped.
  • On iPhone, the app crashed when asking for the microphone, and once that was fixed, it claimed speech recognition wasn’t available. The code was looking for the language written as “en_US” and the iPhone calls it “en-US”.
  • The tutor talked without sound on iPhone, because speech recognition left the phone’s audio in a mode that doesn’t play anything.
  • Apple and Google rejected the app on the first review: Google because the sign-in button didn’t respond, and both because there was no test account for the reviewers.

Results

  • The app works on Android and iOS and is in private beta, invite only. The store listings are under review.
  • It has 852 automated tests on the server and 52 in the app.
  • The two-layer memory works, and users decide what gets remembered about them.