EdTech Assessment Platform
Web + mobile + AI-graded assessments for K-12 schools
This is a client project. The write-up is intentionally generalized: no client, product, or school names, no data, and no source code are shown. What follows is my own account of the problem, the architecture, and the decisions I led across the three applications.
This is an EdTech platform for K-12 schools that digitises a physical classroom learning programme and layers AI-graded assessments on top of it. Teachers and supervisors move from paper registers and hand-marking to a single system that tracks classroom progress, distributes structured discussion content, and evaluates handwritten student answer sheets automatically.
It is built as three coordinated applications sharing one backend: a web app for administrators and supervisors, a mobile app that supervisors carry into classrooms, and a separate AI evaluation service that scores scanned answer sheets. All three talk to the same managed Postgres backend, with access enforced by row-level security so each school only ever sees its own data.
I led the engineering across all three applications as lead engineer: the web platform, the mobile app, and the AI evaluation service, along with the integration that stitches them together. That meant owning the architecture and the hard cross-cutting decisions, from how offline-ish classroom scanning should behave to how an async AI grading service reports its results back safely.
The web and mobile apps share a single managed Postgres backend that provides the database, authentication, and serverless edge functions in one place. Choosing a shared backend meant the mobile app could reuse the exact same schema, auth, and row-level-security policies as the web app rather than reimplementing them, which kept the two clients consistent as features moved between them.
The web app is a React and Vite single-page app for administrators and supervisors. The mobile app is built with Expo and React Native so a single TypeScript codebase ships to both Android and iOS through cloud builds and the app stores. Answer-sheet capture runs on-device: the camera feed is passed through document detection and perspective-correction so the uploaded image is a clean, cropped page rather than a photo of a desk.
AI grading lives in its own FastAPI microservice, deliberately kept separate from the product backend. When a scan is uploaded, the backend calls the service with the images and question list; the service returns immediately, grades in the background using a vision model, and pushes results to a callback URL when done. Making the flow callback-based rather than polling meant the mobile and web clients never sit blocked waiting on a slow, variable AI step, and the grading service can scale independently of the rest of the platform.
Edge functions on the backend act as the trusted boundary between the apps and the AI service: they handle upload, trigger evaluation, and receive the callback that writes scores back for supervisor review. That kept the AI service's credentials and contract in one controlled place instead of spread across two client apps.