Kurilabs

Turning My Japanese Study Routine Into an AI Project

Long time no post. I guess it is about time, right?

Since November, I have been taking Japanese classes. I have experience teaching languages, Spanish and English, so I understand how important it is to practice spontaneous conversation and listening, something that is often missing when you study with textbooks.

And hey, AI assistance is actually perfect for this. So I started experimenting with tools I had available.

My product requirements looked something like this:

  • A chatbot specifically focused on practicing very specific content, vocabulary, grammar points, and expressions we are learning lesson by lesson.

  • The app should send me periodic invitations to start a conversation, and it should have time limits and closing moments for each session.

  • In the conversation, the bot should speak to me with audio, and I should be able to reply by typing. If I ever do not understand something, I should be able to write in Spanish, or in the user’s native language, and the AI should clarify my doubts according to the lesson we are studying, with a very clear context.

The first approach I tried was with OpenClaw, and a few days later with Hermes. The results were not bad at all, but I had two main problems: setting everything up was quite complicated, and it took a lot of back and forth with the AI to get exactly what I wanted. On top of that, it burned a lot of tokens. Each conversation used quite a few tokens, and over time it started drifting away from the intended behavior. For example, during practice conversations, it was not supposed to translate or correct me. At first it handled that well, but later it seemed to forget.

The second step in this process came from the fact that around that same time I started researching AI agent development. In particular, I bought a course on AI agents that explained two ways to build them: with Python code or with n8n.

I am not a Python expert, and I think n8n is a great tool for prototyping and iterating very quickly. After a lot of iteration, the project structure and flow ended up looking something like this:

  • A JSON file stores session data, indicates whether a session is active, whether the conversation should end, and keeps the conversation memory. There are two types of conversations: the actual practice session, which is a Japanese conversation with specific roles where the user chats with a Japanese partner, and a consultation conversation, where the user asks questions and gets clarification. These are stored separately.

  • When the user sends a message, in my case through Nextcloud Talk, n8n receives it and starts the flow. It loads the session JSON, checks whether there is an active session, and if there is, it passes the message to a first agent that determines what kind of message it is: a question, a continuation of the practice, or something unrelated. If it is a practice conversation, the user message is sent to a non-reasoning model that does not need to be especially advanced, prioritizing speed and cost efficiency, and it only uses the history of that conversation in memory. But if it is a consultation, the AI acts as a tutor, and its context includes the practice conversation so far plus all previous consultations. For this, I use a slightly more advanced model so it can produce a better structured answer.

This whole process was full of trial and error, but it was also a lot of fun. I learned a ton along the way, especially about prompt design, workflow structure, model selection, and how much small details matter when you want an AI system to behave consistently.

What started as a personal solution for my Japanese studies ended up becoming something much bigger than I expected. And honestly, that is one of the things I like most about building side projects: sometimes you begin trying to solve a very specific problem for yourself, and by the end you realize you have built something that might actually be useful to other people too.

So for now, that is where this project stands. I am still exploring, still learning, and still thinking about how to turn it into something public and useful.

Now, in June 2026, I am diving into how LLMs and agents work with Ruby and Rails, so I am sure there will be more on that soon :D

For the moment, I am playing with RubyLLM, and it feels incredibly easy to use, very Ruby on Rails in the best possible way.