Replacing four disconnected tools with one teaching platform
An A/L chemistry tutoring institute, Colombo
ENGAGEMENT
- PARTNER
- An A/L chemistry tutoring institute, Colombo
- SECTOR
- Education
- TYPE
- Product build
- STATUS
- Delivered
- DURATION
- 14 weeks
SEC.01 — PROBLEM
Where they were
The institute ran its teaching across a video host, a messaging group, a spreadsheet of marks and a separate record of who had paid. Answering a parent’s question about whether a student was keeping up meant opening all four and trusting that none had drifted. Video costs were rising without anyone being able to say which lessons were responsible.
SEC.02 — APPROACH
What we did
We modelled the syllabus, the cohort and the enrolment as distinct entities so that student progress became a query rather than a reconciliation across tools. Access to lesson video resolves from enrolment state at request time, which means payment status and access stop being two separate things somebody has to keep in sync. Before choosing where video would live, we modelled egress cost per provider against the institute’s actual viewing pattern.
SEC.03 — ARCHITECTURE
The decisions that carried it
NOTE.01
Cohorts as instances of a syllabus, so a course can run again without duplicating content or losing the previous term’s marks
NOTE.02
Signed, expiring URLs for lesson video, served from object storage rather than through the application
NOTE.03
Immutable assessment records with corrections as new rows, so any mark can be explained after the fact
NOTE.04
Access derived from enrolment state at request time, removing the batch job that used to revoke lapsed accounts
Stack
- TypeScript
- Next.js
- PostgreSQL
- Object storage
SEC.04 — OUTCOMES
What changed
Described as capability rather than as a percentage we cannot evidence.
Student progress, attendance and payment status answerable from one place
Video delivery cost modelled and predictable rather than discovered on an invoice
Marks traceable to a moderation history instead of a spreadsheet’s edit log
Have a problem shaped like this?
Tell us where you are now and what has to be true when it works.