Skip to content
Emin Akif Erzurumlu
All work

Karnova

A learning platform that pinpoints exactly which objective a student is stuck on, and adapts its content accordingly.

Role
Backend & AI Developer
Scope
Team project · 3 people
Year
2026
The problem

When a student scores 40 on a maths test, that number says nothing about where they got stuck. A teacher with thirty students cannot diagnose each one individually — and even if they could, another test arrives the next day. A grade is an outcome, not a diagnosis.

Approach
  • I built the data model around learning objectives rather than grades: every question maps to one or more curriculum objectives, and answers aggregate at the objective level.
  • Instead of letting the AI assistant free-write, I gave it function calling — the model reaches the student’s real objective data through functions it invokes itself. That structurally prevents it from telling a thriving student they are failing.
  • Each school’s data is isolated: a multi-tenant setup with role-based access control gives teachers, students and administrators separate doors.
My part in this

In a three-person team I own the backend and AI side: data model, REST API, Gemini integration and the authorisation layer. The interface and the operations, content and QA side belong to the other two.

Outcome

The platform now delivers objective-level reporting and adaptive content suggestions. The source is currently private; the architecture documentation is public.

What I learned

What makes a language model trustworthy in production is not a better prompt but a data path it cannot fabricate. Free-form generation gives you no way to stop it from saying something false about a student; with function calling its answer is tied to the actual record in the database. It stopped guessing and started querying.

Built with

Django 6 · Python · PostgreSQL · Google Gemini API · REST API · RBAC

Source is private. Architecture docs are public.