Case studyMedical Information Simulation (MIS)
A web app for teaching laboratory quality control. Faculty set up QC lots with target values. Students run QC, enter results and read their own Levey-Jennings charts with Westgard rule checks, then faculty grade each run. It began as a team capstone for Texas Tech University Health Sciences Center. I later finished the core workflow end to end. It is an educational simulation, not for clinical use, and all data is synthetic.
React 18, TypeScript, MUI, Recharts, Vite, ASP.NET Core 8, EF Core, ASP.NET Identity + JWT, SQL Server, Docker, Playwright, GitHub Actions, Firebase Hosting
What I built
Every page talks to one typed API interface. The normal build sends it over HTTP to the ASP.NET Core API. The demo build swaps in an in-browser implementation with the same workflow rules over synthetic data, so the live demo is free static hosting.
React + TypeScript client
→↓
Typed MisApi interface
→↓
ASP.NET Core 8 API (Identity + JWT)
→↓
EF Core → SQL Server
- The full loop: faculty create and edit QC lots and analytes; students order a run, enter results with live z-scores, and submit; faculty grade it or return it for correction; grades land in a gradebook for both roles.
- Levey-Jennings charts for every analyte, with points colored by Westgard result (1-2s, 1-3s, 2-2s, R-4s, 4-1s, 10x), plus a data table for keyboard and screen-reader users.
- Server-side authentication with roles: deny-by-default authorization, sign-up that can only create students, per-account lockout and a per-IP rate limit on sign-in. A student asking for another student’s run gets a 404.
- The run lifecycle (in progress → submitted → graded, or returned → resubmitted) as a small pure state machine, so each rule is a one-line unit test.
- Local setup with no shared secrets: a script generates the database password and JWT key, and the API refuses to start without a strong key. One Docker Compose command runs the whole stack.