EdTech · Artificial Intelligence

A Language Learning Platform Where You Learn by Talking to AI

The backend of a language learning platform where users practise written and spoken conversation with AI and track their progress: a layered API on .NET 8, real-time chat with SignalR and an OpenAI integration managed entirely on the server.

Role
Backend Developer
Stack
.NET 8 · ASP.NET Core Web API · PostgreSQL · EF Core · SignalR · OpenAI API
SesliDil ana ekranı: günlük hedef, yapay zekâyla konuşma başlatma ve pratik konuları9:41Merhaba, ElifBugün ne konuşalım?E%60Günlük hedef9 / 15 dk6 günlük seri6 dk kaldı, devam etYapay zekâyla konuşSeviyene uygun sohbet, istediğin anPratik konularıTümü →Günlük hayatA2SeyahatB1İş görüşmesiB2Son konuşmaSeyahat · Otelde check-in8 dk · dünDevam etAna sayfaPratikİlerlemeProfil

Knowing the language, but not speaking it

Most language learners share the same story: they've memorised the vocabulary, learned the grammar rules and understand what they read. But when it's time to speak, they freeze. Speaking only improves by speaking, and finding someone to practise with at any given moment isn't easy.

SesliDil was designed to close that gap: a platform where users can talk to AI at any time of day, get an instant reply and see their progress. Our part was building the backend behind that experience: user data, conversation sessions, communication with AI services, and exposing all of it to web and mobile clients through one consistent API.

“Turning speaking practice into an experience that's there whenever you want it.”

Our Approach

In projects with an AI integration, the easiest path is to pile everything into one place: a request comes in, goes straight to the model and the answer comes back. That's enough for a first demo, but by the second or third feature the code starts to fall apart. We chose to separate responsibilities from day one.

On ASP.NET Core Web API we split the controller, service and repository layers. Components such as OpenAI and SignalR live inside this structure, each behind its own service. The development environment runs on Docker, and every endpoint could be tested through Swagger.

Technical Decisions

1

Layered architecture with clear responsibilities

Controllers only accept the HTTP request and return the response; business rules live in the service layer, and data access lives in repositories built on Entity Framework Core. Adding a new feature came down to extending the relevant service without touching existing endpoints. Because services are independent of the data layer, they were also easier to test and to change later.

2

The same response format on every endpoint

One of the most tiring things for a client developer is every endpoint answering in a different shape. To prevent that from the start, we wrapped every response in a shared model: whether the operation succeeded, a descriptive message and the returned data. The web and mobile apps worked with a single response handler, and errors could be shown the same way on every screen.

3

AI services behind the backend

OpenAI services powered the conversational and text-based interactions, but clients never talked to them directly; every call went through services on the backend. As a result the API key never reached the client, model or prompt changes could be made on the server without an app update, and the client only ever knew our own API.

4

Real-time conversation with SignalR

In speaking practice, latency breaks the experience. Instead of the client constantly asking "is there a new message?", we set up a persistent connection with SignalR: the ChatHub receives a message, passes it to the service layer and pushes the reply to the client the moment it's ready. Connection management and error handling were central concerns of this layer, and because the hub uses the same service layer as the REST controllers, business rules were never written twice.

From the Interface

Konuşma ekranı: yazılı ya da sesli cevaplar, yapay zekâdan anında gelen yanıtlar9:41AIKonuşma partneriÇevrimiçi · Günlük hayatHi Elif! How was yourweekend? Did you doanything fun?DinleI go to the cinema withmy friends.sesli · 0:04go → wentSounds great! Small tip:for the past we say“I went”. What did youwatch?I went to a comedy film.It was really funny!Mesaj yaz…
Conversation screen: written or spoken answers, with instant replies from the AI.
Sesli pratik ekranı: kullanıcının konuşması dinlenir ve metne dönüşür9:41Sesli pratikGünlük hayat · A2PARTNER SORUYORWhat did you watch?Ne izlediğini anlatDinleniyor…00:07“I went to a comedy film.It was really funny…”YenidenGönder
Voice practice: the user speaks, and their words are turned into text and added to the chat.
İlerleme ekranı: günlük pratik süresi, seri ve son oturumlar
Progress screen: daily practice time, streak and recent sessions.

Results & Impact

The outcome was a backend built to grow, one that keeps the AI integration separate from the rest of the application. Adding a new conversation feature meant extending the service layer without breaking the existing structure, and the web and mobile clients worked with the same response format from start to finish.

The principle we carried forward from this project: put AI at the centre of the product, but keep it at the edge of the architecture, behind its own service. When the model, provider or prompt changes, the rest of the product shouldn't feel it.

Want to add AI to your product?

Adding a chat, voice or LLM-based feature to your existing app, or building a solid backend with .NET: whichever it is, let's talk.

Get a Quote