The problem
Continuing medical education in Italy is tightly regulated: every course, every enrolment and every credit has to be traceable for years. The client was running all of it on a management system built years earlier, which had become the thing holding the business back — slow, hard to change, and impossible to extend without breaking something else. Rewriting it meant moving two decades of real data without losing a single record.
What I built
A complete rebuild of the management platform, from scratch:
- Course and credit management for accredited continuing education, with the reporting the regulator requires.
- Enrolments, participants and certificates, with the full history of each professional kept intact.
- A migration of the live data: 20,445 contacts and 39,970 enrolments brought across from the old system, verified record by record.
- A separate research-data platform (SESP Data) for an EU-funded research project, where the platform itself is one of the project’s deliverables and not merely a tool.
Built with
React on the front end, NestJS and PostgreSQL behind it, on a dedicated server. The research platform is a Next.js application. No framework was chosen for fashion: the old system failed because it could not be changed safely, so the new one is typed end to end and has its data model written down rather than implied.
Why it was done this way
The rebuild ran alongside the old system instead of replacing it overnight. Continuing education has deadlines set by law: a failed cut-over would not have meant a day of downtime but professionals losing credits they had already earned. The data was migrated first and checked against the old system’s own totals, and only then did anything move.


