Context and challenge
dotlaw trains the staff of other companies in GDPR, data protection in particular sectors, information security and ISO 27001. A course ends with an exam and a certificate, and the HR department later shows that certificate during an audit. With one company, a spreadsheet and a few emails will do. With twenty-three, they will not. Each has its own people, its own set of courses and a manager who wants to know who still has not finished.
The law firm has no IT department. The daily running therefore had to fit into a panel: add a company, upload a list of people, assign a course, remind the ones running late, revoke a certificate. Without writing to a developer and waiting for an answer.
Solution
I designed and built the whole platform: the page where a company opens its account, the participant’s side, the manager’s panel and the law firm’s administration. Every company sits in the same database, and a manager sees only their own people. The server checks that boundary on every request. A participant watches video lessons, and every few seconds the platform records how far they got, so the next visit offers to pick up from there. The exam opens only once all the material has been watched. It has a time limit, a cap on attempts and a pause between them, and anyone who fails watches the lessons again. After a passed exam the server generates a PDF certificate.
A company’s manager sees the team’s progress, sends a reminder with one button and downloads an Excel report, or the whole group’s certificates in one file. The law firm sets up organisations with their registration codes, imports people from a CSV file, caps the seats on a course and pulls new recordings in from Vimeo. It can revoke a certificate or issue it again. The event log records sign-ins, password resets, certificate changes and syncs. A separate tab shows the health of the system: the database, the mail queue, the last day’s errors and the emails that did not go out.
The platform runs in production, and I maintain it. Signing in, registering and resetting a password each have their own limit on attempts, and after 30 minutes without activity the system signs the user out. When the data moved to the new model, the history of progress, exams and certificates went across in a migration of its own, with the old tables left in place. Since then the database changes only through versioned migrations. There are 24 of them. The interface has a dark mode and a Ctrl+K search that finds a company, a course or a person from any screen. The panel loads on its own, so the public site never downloads its code.
Results and stack
A multi-company training platform: video lessons, exams, certificates, and a panel of its own for each company’s manager.
- 23
- organisations, each with its own people and courses
- 804
- participant, manager and administrator accounts, as of September 2026
- 899
- certificates issued after passed exams, as of September 2026
Angular 16RxJSAngular MaterialNode.js 18ExpressMySQLVimeo APIpdf-libWinstonSentryPlesk