A multi-tenant, cloud-native analytics platform for research labs — designed, built, and deployed solo, from database schema to React interface to AWS infrastructure.
Research labs running RT-QuIC and similar fluorescence assays were stuck analyzing plate data in spreadsheets and one-off scripts — slow, error-prone, and impossible to audit. Regulated science needs reproducible analysis, clear provenance, and multiple labs/teams working in isolation without stepping on each other's data.
QuicLens turns that workflow into a real platform: upload plate data, get real-time kinetic analysis and classification, and keep a full audit trail — with strict separation between organizations and labs.
A serverless, single-region AWS stack defined entirely in infrastructure-as-code.
Frontend — React + TypeScript (Vite), Plotly for data-viz, served as a static build from S3 behind CloudFront with Origin Access Control and HTTPS redirect.
Backend — FastAPI (Python) packaged as a container image and run on AWS Lambda via Mangum, fronted by API Gateway. Clean layered structure: api/routes → services → models, with a dedicated analysis layer.
Data — DynamoDB with per-tenant partitioning and GSIs; an encrypted S3 bucket (retain-on-delete) for archived plate data.
Auth — WorkOS AuthKit for enterprise SSO and multi-tenant identity.
Infrastructure — AWS CDK (TypeScript). The entire stack — buckets, distribution, Lambda, API Gateway, IAM policies, and frontend deployment — is reproducible from code.
Lab usage is bursty — heavy during analysis runs, idle otherwise. Serverless means no idle cost and no servers to patch, and the FastAPI app stays portable (it runs identically locally and in Lambda via Mangum).
Access patterns are tenant-scoped and key-based (org → lab → project → plate → results). DynamoDB gives predictable performance and clean per-tenant isolation via key design, with IAM policies scoped to specific table ARNs as a second layer of tenant safety.
The analysis stack (pandas/NumPy/SciPy) exceeds the zipped-Lambda size limits and is far simpler to manage as a container.
Isolation is enforced at multiple layers: key design in DynamoDB, service-layer authorization checks, and scoped IAM. The development history reflects deliberate security hardening passes — fixing auth-bypass and cross-tenant data paths found in self-audits.
| Layer | Tech |
|---|---|
| Frontend | React, TypeScript, Vite, Plotly, Tailwind |
| Backend | Python, FastAPI, Mangum |
| Data | DynamoDB, S3 (encrypted) |
| Analysis | pandas, NumPy, SciPy |
| Reporting | ReportLab + matplotlib (server-side PDF) |
| Auth | WorkOS (enterprise SSO) |
| Cloud | AWS Lambda, API Gateway, CloudFront, IAM |
| IaC | AWS CDK (TypeScript) |