Fuego: Language Learning — Your AI voice tutor for real conversations, with seven language flags

Inspiration

I wanted to build an AI language tutor because I've been living in Spain for four years and... yo hablo un poco. My Spanish is disappointingly weak considering how long I've been here. I can have a basic conversation and introduction, but that's essentially it. I'm sure it all has to do with me staying busy, having three kids and building a mobile app business, and nothing with my laziness, but anyways...

At the beginning of this year, as usual, I set myself three yearly goals that I hoped to accomplish. Only three, to keep it simple:

  • make a ton of money and grow my business (obviously)
  • get ripped (health is important!)
  • learn Spanish (communication is important!)

I made a small progress on getting ripped (not part of the judging stage). I definitely grew the business and made more money. My Spanish improved too, but not enough. Soo... as a lifelong builder, I thought that I would solve it with code. Obviously.

Getting to this idea was actually a journey of many other apps and experiments. Only because of them did I learn how to fine-tune the agent properly to deliver the desired value to the user. Slapping a simple prompt + AI wrapper is not enough in this case.

Little did I know, once I started, how many apps like this were already on the market. I keep discovering more every week, but it's fine... I have my own vision for it, and I wasn't really happy with what was on the market (except a few exceptions).

The market is huge, there are a ton of competitors, and I have my own angle that I think is valuable. I built a lot of custom stuff to make the experience seamless and I plan to get feedback and iterate on it.

I was aiming to release this app mid-summer, but I ended up spending a lot of time polishing the details, changing the mascots, the design (what you see is probably the v3), the message, the branding, the animations, the experience... you get it.

(Did I mention I've created 1000 word packs for 7 languages with audio and visuals?)

The app might seem straightforward on the surface, but it has a ton of variables to make it right:

  • The voice
  • The speed of it (which differs by language!)
  • The adjustments needed for each level (beginners need more native speaking, advanced ones have no issues hearing more of the target learning language).

The thing with AI is that since it's not deterministic, there are millions of edge cases and ways to go about it. So slapping a simple prompt + voice pipeline wouldn't make the cut.

You can think of it as an equation:

(language levels A1-C2) x (number of available user languages) x (number of supported languages to learn - 7)

On top of it, each language has its own nuances... anyways. I could talk for ages about all the challenges and tiny improvements, but it's already long enough.

What it does

Fuego is a tutor you talk to. You hold a button, say a sentence in Spanish or French or German or a few other languages, let go, and the tutor answers out loud, corrects what you got wrong and carries on. If you would rather type, the text chat goes through the same tutor with the same abilities, so nothing is missing on either side. The tutor explains things in your own language (there are 39 to choose from), picks topics for you, and re-reads your level as you talk instead of asking you to sit a placement test.

Actual Fuego conversation and session recap, showing a tutor correction and words to save

Around the conversation, there is a full course: seven target languages (English, Spanish, French, German, Italian, Portuguese and Polish), a thousand core words per language in themed packs with a picture, a sentence and audio for each, spaced-repetition flashcards, reading and listening exercises, and a daily plan the app builds one section at a time as you open it. Every session ends with a recap of what went well, which words are worth keeping and what to fix next time.

Actual Fuego word card and listening exercise

Your first conversation with the tutor is free. Pro unlocks unlimited conversation, by text and by voice, and it is sold through RevenueCat on both stores.

Why Kotlin, and why now

Kotlin (well, actually Java, but close!) is where I started. I was an Android developer in the Java and Eclipse days, then moved to Kotlin and Android Studio, and I never stopped liking it. Swift and Kotlin syntax are very similar, but over the years I always preferred the latter:). Not that it matters now in the age of AI where we don't even read code, but my bias prevailed.

Around 2021 I switched to Flutter, because I wanted to build for iOS as well and my time was limited (work + kids + working in the evenings). It worked, but it always felt like a compromise. Cross-platform meant giving something up: cold start, the feel of the platform, a runtime sitting between me and the OS. It was fast to develop with hot reload, but still, the feeling was not the same.

So I kept checking on Kotlin Multiplatform, waiting for it to grow up. Within the last year, it finally clicked for me. Kotlin compiles to native code on both platforms, so there is nothing to give up. And if I ever want a fully native SwiftUI app, the logic is already shared so it's easy to transition. I would only rewrite the UI, not the whole app. That is a big reason I'm moving all my apps to it.

For Fuego I went with shared Compose UI, so the chat and the animations feel the same on both. About 91% of the Kotlin is shared: 43.9k lines, against 4.3k platform lines and one 358-line Swift file.

How I built it

The app is built with Kotlin Multiplatform, with a shared Compose Multiplatform UI for Android and iOS. Everything lives in one Gradle module.

The screens, animated onboarding, navigation and state, Ktor networking, voice turn state machine, RevenueCat billing and localisation all live in commonMain. That's about 44,000 lines of shared Kotlin, excluding generated API models and tests. There's another 4,300 lines of platform-specific Kotlin, plus one 358-line Swift file.

Fuego mobile source split: 91% of counted Kotlin lines are shared across Android and iOS

The platform layer uses expect/actual declarations and injected interfaces for things like microphone capture, audio playback, haptics and native SDK integration. The voice state machine and playback orchestration are shared; Android plays streamed audio through AudioTrack, while iOS uses AVAudioEngine. The Swift file handles Firebase integration and the iOS app lifecycle, including deep links and shortcuts.

The backend is Fastify and TypeScript. The tutor is powered by a 3-stage, custom pipeline, not a ready-to-go 3rd party live voice API.

Challenges I ran into

The hardest product challenge was figuring out how much help the tutor should give. A beginner needs explanations in their own language, but if the tutor keeps switching back too quickly, they barely get to practise. More advanced learners need room to talk without every mistake turning into a grammar lesson. Getting that balance right took a lot of conversations, prompt changes and trying it again.

Voice added another layer. A reply can look perfectly fine as text and still be difficult to follow out loud. I had to adjust speaking speed by language, add pauses when the tutor switched languages and make it easier to follow the words on screen. Around that, I kept revisiting the onboarding, mascots, design and daily lessons. There are plenty of things you can put in a language app; deciding what someone should do next, and making them actually want to do it, was harder.

Being bilingual and having an American wife helps. I used my Polish to compare the results between languages, while my wife caught nuances in English.

On the technical side, streaming voice took the most work. The app needs to start playing a reply while the rest is still arriving to feel seamless, then stop cleanly if the user interrupts or backgrounds the app. The voice state machine lives in shared Kotlin, with platform-specific audio players for Android and iOS. I also learned to be careful with API changes: a new response value from the server shouldn’t break an older app, so fields that can grow now use strings with safe fallbacks, backed by compatibility tests.

Accomplishments that we're proud of

Probably building my own custom pipeline for Speech-to-Text, Text-to-Speech and LLM processing. I decided not to go with ready-to-go solutions because those were too expensive to run at scale, but also didn't allow me to have full control over the experience.

It took quite a bit of work to make it work seamlessly and instantly. I'm honestly still shocked how fast the voice processes the request and responds, considering how much is going on during the conversation.

There are a lot of small tweaks and tricks to make it work as such:)

What I learned

I learned that getting an AI tutor to answer is the easy part. Getting it to teach someone who can barely put a sentence together takes a lot more work.

A beginner needs help in their own language, but also enough Spanish to make progress, and that balance changes as they improve. Even “normal” speaking speed turned out to mean something different in each language. I spent time adjusting pauses between languages, highlighting the sentence being spoken and tweaking emotions so it's actually fun to talk with the tutor. Tiny details, but they decide whether you can follow the conversation or get lost.

Building the word packs and exercises taught me the same thing: generating content is only the beginning; making it clear, consistent and useful takes iteration.

I started this because I needed help learning Spanish myself, and I treat it as the ultimate test, am I going to learn Spanish with it? :)

What's next

Well, now it's my turn to learn Spanish finally 😂.

But in all seriousness, I spent a lot of time building and tweaking the app so it's finally time to market it. I'm finally happy with the result and I think that it can provide great value to the user and actually teach them the language!

Marketing channels I want to go with, in this order:

  1. Organic TikTok/IG/YT, both short-form and long-form
  2. SEO/ASO (already started, but those takes time)
  3. Paid UA with Meta and TikTok ads (once I have winning formats)

The category I'm aiming for mostly: Ship Kotlin Everywhere

Built With

Share this project:

Updates

Submission history