Client project
The Clinician
Medical E-Learning Platform
Medical students buy a course or exam bundle and get access automatically. I built the NestJS and PostgreSQL backend, from payments and enrolment to exams, and deployed it.
- Role
- Backend & DevOps
- Status
- In production

The problem
Medical students preparing for professional exams needed one place to buy courses and practise exam-style questions, with enrolment that works the moment they pay.
Overview
The Clinician is a growing platform for medical students that focuses on exams and practice: courses, medical-college-style exams and bundles that combine a course with its exams. I built the backend with NestJS and PostgreSQL, worked with the frontend developers on the API, and deployed and ran the whole stack.
What I did
- Designed and built the NestJS + PostgreSQL backend for courses, exams, course + exam bundles and enrolment.
- Implemented authentication with HTTP-only JWT cookies and role-based access control for students and admins.
- Integrated the payment gateway so a successful payment enrols the student and unlocks their content automatically.
- Built the exam engine for MCQ and SBA questions: practice sessions generated from the chapters and difficulty a student picks, and scoring with negative marking.
- Built the admin APIs for managing content, certificates and student progress.
- Deployed the frontend, backend and database on a VPS I set up with Docker and Nginx and hardened with my open-source Linux setup script, with automated database backups to Cloudflare R2.
- Set up GitHub Actions CI/CD for the frontend and backend, plus a development environment that deploys automatically from pull requests to main.
Highlights
- Fully automated enrolment: checkout → payment confirmation → access granted, with no manual step.
- Practice exams assembled on demand from chosen chapters and difficulty.
- Bundles that grant a course and its exams together in one purchase.
- Exams of 100+ questions fetched, answered and scored in one flow, with negative marking for wrong answers.
Challenges
- Querying a question bank of thousands of questions by chapter and difficulty. My first query design slowed the whole system down under real load, so I redesigned it until practice sessions loaded quickly again.
- Handling exams of more than 100 questions end to end: fetching them, saving each answer, and calculating marks with deductions for wrong answers.
Results
- Live in production, with enrolment running without manual intervention.
- Handed the finished backend over to a senior developer for ongoing maintenance.
Want something similar built? Get in touch →