The server owns the exam
NestJS controls deadlines, grading and submission. Closing the app does not pause an exam. Correct answers stay on the server until the learner checks a study answer or submits an exam.
A certification practice platform built around focused study, server-timed exams and progress that survives the next session.

Markdown question banks are useful source material, but they expose answers too early and make it difficult to resume practice or review mistakes. I wanted a phone-friendly study session and a timed exam with rules that remain consistent when a learner closes a tab.
I defined the requirements, selected the stack, designed the data model and API, built the application and documented deployment and rollback. The initial courses use attributed, MIT-licensed material from CloudCertPrep; course creators can also write questions or import their own JSON question banks.
NestJS controls deadlines, grading and submission. Closing the app does not pause an exam. Correct answers stay on the server until the learner checks a study answer or submits an exam.
Accuracy uses the first answer to each question. Edited questions create new versions, so an existing response remains tied to the question the learner actually saw.
The Expo web application calls a NestJS API. Supabase handles sign-in and hosted PostgreSQL, while Prisma accesses application data through the API. Authorization and exam rules live in the backend.

API end-to-end tests apply the real migrations to PGlite, with the authentication token check mocked. Vitest, type checks and linting support delivery. Nginx serves the exported web app and forwards API requests to a non-root Docker container on loopback. Frontend releases use commit-named folders and an atomic symlink switch for rollback.
The web application is live in English and Greek, with study and exam modes, saved progress, course creation and imports. Native iOS and Android releases and further deployment automation are planned work.