Case study 01 / Data Science Institute
Python exams that run in the browser
A self-paced certification platform for accredited data science programs. I was the sole engineer, working directly with the founders and owning the architecture end to end.
Result
Full-stack lead engineer
2025 – 2026
Next.js 15, React 19, JupyterHub, Docker, PostgreSQL
Architecture, platform, exams, payments
The problem
A multiple-choice quiz alone can't certify a data scientist: students also have to write real Python, under proctoring, without installing anything. Doing that for every learner means giving each one a live sandbox, and doing it self-hosted means the bill has to stay predictable while the course content stays easy for non-engineers to edit.
Architecture
- I built
- Managed service
- Self-hosted
- 01Matches a build point
The product

What I built
An in-browser Python environment: JupyterHub integrated into the Next.js platform, with a custom Clerk JWT authenticator (RS256/JWKS) for single sign-on and a per-user isolated Docker container spawned on demand.
A dual-mode container architecture: lightweight auto-culled containers for practice, dedicated higher-resource ones for proctored exams, with bookings throttled to keep self-hosted costs predictable.
The coding-exam pipeline end to end: scheduled slots, OctoProctor proctoring with an admin reviewing every pass, automated notebook capture through the JupyterHub Contents API, submission archival to Cloudinary, and workspace locking after submit.
The learner platform in Next.js 15, React 19 and TypeScript: parts, units and lessons served with TanStack Query, Zustand and Tailwind.
A Sanity headless CMS syncing course content to PostgreSQL over signature-verified webhooks with tag-based cache invalidation, plus dual payment gateways (Stripe globally, Razorpay in India) with webhook-driven access provisioning.
A sync from the CMS to the accreditor's course system: rate-limited and idempotent, it sends only real changes, retries only once a read shows a write didn't land, and merges reviewers' edits three ways.


