shaheeranser
All projects

Exam Proctoring Platform

Proctoring that never leaves the browser.

An LTI 1.3 exam platform that launches inside Moodle and proctors exams with nothing to install. Detection runs in a web worker on the student's device, so no video leaves the machine — only flagged incident snapshots are kept, on a server the school runs itself.

Apache-2.0 · final-year project, piloted
  • LTI 1.3
  • TypeScript
  • React
  • Express
  • MongoDB
  • Docker

Online exams need supervision, and the usual answers are both awkward. A desktop client has to be installed and maintained on every machine in a lab; a cloud proctoring service streams webcam video off-site, which is hard to justify to students and hard to defend on privacy.

This platform takes the opposite route. It is an LTI 1.3 tool, so from the student's side there is nothing to install and nothing new to learn: they click the exam in Moodle and it opens. Detection runs entirely in the browser, in a web worker, and the video never leaves the device. Only the moments that matter are kept, as snapshots on a server the school runs itself.

From a Moodle click to a graded result

One Express service is the LTI tool, the API and the host for the React client; MongoDB, MinIO and Caddy run alongside it in Docker.

  1. Launch

    Moodle sends an LTI 1.3 launch. Instructors are routed to the teacher views, everyone else to the exam — the role, course and user come from the LMS, not from a second account.

  2. Build

    Teachers write quizzes inside the tool: questions, options, correct answers and per-question scores, with a draft/publish flow, an optional schedule and duration, and access limited to a course enrolment or an explicit allowlist.

  3. Proctor

    During the attempt a web worker runs face detection, multiple-person detection and presence checks with MediaPipe Tasks Vision, TensorFlow.js and face-api, alongside visibility and tab-switch guards. All of it is computed on the device.

  4. Strike

    Violations accumulate against a configurable soft-violation limit. Soft and hard incidents are separate severities, so a glance away and a second person on screen are not treated the same.

  5. Snapshot

    An identity snapshot is taken at the start and a frame is captured on each incident, then uploaded to a self-hosted MinIO bucket. The continuous video stream is never uploaded.

  6. Review and grade

    Teachers watch in-progress attempts over server-sent events, pause or resume a single attempt, and review flagged attempts to uphold, dismiss or grant a retest. Scoring is automatic and the final grade is passed back to Moodle over LTI AGS, with retries.

What is actually there

  • An LTI 1.3 tool (ltijs) that launches from Moodle and returns grades through LTI AGS.
  • Browser-side detection in a web worker: face, multiple-person, presence, and visibility/tab-switch guards.
  • An incident model with soft and hard severity and a configurable strike limit.
  • Self-hosted snapshot storage in MinIO, with an identity snapshot taken at exam start.
  • A teacher quiz builder, scheduling, enrolment/allowlist control, and a live dashboard of running attempts.
  • A Docker Compose stack (Express, MongoDB, MinIO, Caddy) and a one-shot EC2 deploy script that provisions Let's Encrypt certificates.

Where this stands

This was a final-year project and it has been piloted rather than rolled out, so the honest position matters more than a pitch.

  • Piloted, not production: it has been demonstrated end to end against a real Moodle instance, but it has not run a full real exam cycle.
  • Detection is heuristic. It narrows the obvious cases; it is not a claim of cheating-proofness, and a flagged incident is a prompt for a human to review, not an automatic verdict.
  • Setup is heavier than a typical web app: it needs two external Docker networks and a registered LTI tool. The cold-start walkthrough lives in SETUP.md.

Read the code