Exam-Tracker
Full-Stack & Computer Vision Engineer · 2026A desktop exam platform that watches every session and hands teachers a full, timestamped cheating report.
Exam-Tracker is a desktop exam platform built for teachers who need more than an honor system during remote or in-class assessments. Teachers build exams from a mix of question types, students take them in a dedicated Electron app, and every session is recorded end to end.
The moment a student starts an exam, the desktop app begins recording their webcam and screen and streams both as chunks to the backend, so nothing is lost even if the app or machine crashes mid-exam.
After the exam, the teacher triggers analysis with one click. A queued Python worker runs a computer-vision pass over the webcam feed and a vision-language + LLM pass over screen captures, then hands back a single report: a video with flagged moments on the timeline, and screenshots marked with a red dot and an AI-written explanation of what looked suspicious.
Architecture
Electron Desktop Client
Exam interface, question rendering, webcam + screen capture, and chunked upload of recordings during the exam.
Express API & Queue
Exam/session CRUD, an analysis job queue backed by MongoDB, and status/report endpoints for teachers.
Media Pipeline
FFmpeg merges uploaded chunks into a final session video; MinIO stores video and screenshots for the worker to read.
CV Analysis Worker
Python worker samples webcam frames at 1fps and runs YOLO + MediaPipe to flag phones, missing/multiple faces, black screens, and away-looking gaze.
Vision-Language + Rules Engine
A vision-language model describes each screenshot in structured JSON; an LLM cross-checks it against exam-specific allowed/forbidden rules to flag suspicious activity.
Tech stack
Desktop
- Electron
Backend
- Express
- MongoDB
Media & storage
- FFmpeg
- MinIO
Computer vision
- Python
- OpenCV
- NumPy
- MediaPipe
- Ultralytics YOLO
Vision-language AI
- Qwen VL
- LLM rules engine
DevOps
- Docker
Pipeline
From the moment a student starts an exam to the moment the teacher opens the report, with webcam and screen analysis running in parallel and a failed job retrying on its own.
Exam starts
Webcam + screen recording
streamed as chunks
Exam submitted
Analysis queued
teacher clicks Analyze
Webcam CV
YOLO + MediaPipe
Screen VL + LLM
rules cross-check
Results merged
Teacher gets report
video timeline + flagged screenshots
From exam to flagged report
Taking the exam
- 1Teacher builds the exam: text, QCM, or file-instruction questions, each answered as text, QCM, or file upload
- 2Teacher assigns it to one or more classes
- 3At exam time, the student launches the exam in the Electron desktop app
- 4The app starts webcam recording and screen recording, streaming both as chunks to the backend in real time
- 5Student submits answers; the app finalizes and uploads the last recording chunks
Analyzing a session
- 1Teacher clicks Analyze on a finished exam; Express upserts one queued job per session
- 2The Python worker claims a job, merges the video chunks with FFmpeg, and samples frames at 1fps
- 3YOLO + MediaPipe scan frames for phones, missing/multiple faces, black screens, and away-looking gaze, with persistence filtering to cut noise
- 4A vision-language model describes each screenshot in JSON, which an LLM checks against the exam's allowed/forbidden rules
- 5Results merge into one report: a video with red timeline markers and flagged screenshots with red dots and AI-written explanations
Quality & DevOps
- MongoDB-backed job queue with atomic findOneAndUpdate claims, safe even if a second worker is added later
- Per-stage checkpointing: a failed screenshot pass never re-runs an already-finished video analysis
- Zombie recovery on worker restart: any job stuck processing is marked failed and surfaced for a manual retry
- Persistence and debounce filters (multi-frame confirmation, gap merging) tuned per signal to cut false positives
- Worker heartbeat so the teacher UI can show "analysis service offline" instead of a silently stuck queue
- Hardware-agnostic device selection (CUDA / MPS / CPU fallback) with no hard GPU dependency
Screenshots
Team
Mohamed Elgheith
Full-Stack & Computer Vision Engineer
Want to talk through how it was built?