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 Clinician screenshot

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.

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.

  • 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.
  • 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.
  • 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.
  • 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 →