2025 · Education · Lead · Osvitly
Osvitly — one platform from a school of one to a whole school
Lessons, homework with real evidence, self-grading tests, a gradebook that fills itself, attendance and live chat — for schools, tutoring centres and the teacher working alone.
The same feature set and data model whether a workspace has one teacher or fifty
Context
A school with forty teachers and a tutor working from home need the same things: a place to put the lesson, a way to collect homework, a gradebook, attendance, and a line to the parents. The products that serve institutions treat the solo teacher as a cut-down account, and the products that serve solo teachers cannot grow with them, so the teacher who hires a colleague starts again somewhere else.
The harder half of the brief was not the features but the boundaries — every school's data separate, every parent seeing only their own children, every role bounded — because in education the cost of getting that wrong is not an outage.
Decisions
Chose Making the independent teacher a first-class case on the same data model as a school over a separate cut-down product for solo teachers
The teacher who hires their first colleague is exactly the customer worth keeping, and a separate product makes that moment a migration — which is the moment they compare alternatives. One model costs more care in permissions and more nothing else.
Chose A grading scale stored as raw points and applied as a display preset over storing grades in whichever scale the school selected
Ukrainian schools work on a 12-point scale and others do not, and schools change their mind. If the scale is baked into the stored value, switching it rewrites history — which is unacceptable for a grade. Keeping presentation separate from the stored score means switching is a setting, not a migration with an audit problem.
Chose Deciding lateness once, at the first hand-in over recalculating lateness on whatever the latest submission is
Teachers return work for revision, and revision is a good thing to encourage. If the clock restarts on every resubmission, asking a pupil to improve an on-time piece turns it late — the system would be punishing exactly the behaviour the teacher is trying to produce.
Chose Attendance percentages computed only over what was actually marked over treating an unmarked lesson as an absence
A register nobody filled in is missing data, not a room full of absent children. Reading it as absence produces at-risk flags that are wrong in the direction that damages a pupil, and teachers stop trusting the number the first time they see it.
Chose Parent access scoped to their own children in the query layer, and pupil-to-pupil messaging off until a school turns it on over scoping parent views in the interface, with messaging open by default
A parent seeing another family's grades is the kind of incident a school does not recover from quietly, so the scope belongs where the data is fetched, not where it is displayed. Messaging is the same argument in a different direction: safe defaults, with a report path and a review queue for admins when a school chooses to open it.
What I did
I built the platform around one multi-tenant data model where a school of one is a first-class case, not a tier: identical features, and nothing to migrate when a teacher hires colleagues later.
Teaching runs on a block-based lesson editor — rich text, images, video, audio, attachments — written once and scheduled to as many classes as the teacher takes. Tests grade themselves on submit for choice questions and queue open answers for the teacher, with answer keys that never reach a pupil's screen. Homework accepts files, screenshots, video and links, with a revision loop. Projects have a task board; the gradebook fills itself from tests, homework and graded projects; attendance, a per-pupil progress page with an at-risk list, live chat and announcements sit alongside. The whole platform is bilingual, English and Ukrainian.
Outcome
One workspace covers a school of one and a school of fifty, with per-school data isolation at the database level, role-based access across admin, teacher, pupil and parent, and a parent portal scoped to each family's own children.
Schools pay for teaching seats only, and a seat starts counting when a teacher accepts the invitation rather than when it is sent.
In hindsight
The rules that turned out to matter most were the small ones about time and state — when a submission counts as late, what an unmarked register means, whether changing a grading scale touches stored grades. I settled several of them during implementation rather than before, and each one that moved later cost a migration and a conversation with a teacher who had already learned the old behaviour. Next time I would write that set of rules down as explicitly as the data model, because they are the data model: they decide what a stored value means.