Karnova
A learning platform that pinpoints exactly which objective a student is stuck on, and adapts its content accordingly.
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.
- 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.
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.
The platform now delivers objective-level reporting and adaptive content suggestions. The source is currently private; the architecture documentation is public.
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.
Django 6 · Python · PostgreSQL · Google Gemini API · REST API · RBAC
Source is private. Architecture docs are public.