← Back to portfolio
Case Study

QuicLens

A multi-tenant, cloud-native analytics platform for research labs — designed, built, and deployed solo, from database schema to React interface to AWS infrastructure.

The source is private (commercial product). This case study covers the architecture and engineering decisions. A live walkthrough is available on request.
Research use only — not for diagnostic use. QuicLens is a laboratory analysis tool and does not provide medical diagnosis or clinical decisions.

The problem

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.

What it does

Architecture

A serverless, single-region AWS stack defined entirely in infrastructure-as-code.

BrowserReact client
CloudFrontHTTPS · OAC
S3React build
/api/*
API GatewayREST API
LambdaFastAPI · container
DynamoDBtenants · plates
S3 archiveencrypted
WorkOS  enterprise SSO / multi-tenant auth

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.

Engineering decisions & trade-offs

Why serverless (Lambda + API Gateway) over a long-running server?

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).

Why DynamoDB over a relational database?

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.

Why a container image for the Lambda?

The analysis stack (pandas/NumPy/SciPy) exceeds the zipped-Lambda size limits and is far simpler to manage as a container.

Tenant isolation as a first-class concern

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.

Testing & reliability

Stack at a glance

LayerTech
FrontendReact, TypeScript, Vite, Plotly, Tailwind
BackendPython, FastAPI, Mangum
DataDynamoDB, S3 (encrypted)
Analysispandas, NumPy, SciPy
ReportingReportLab + matplotlib (server-side PDF)
AuthWorkOS (enterprise SSO)
CloudAWS Lambda, API Gateway, CloudFront, IAM
IaCAWS CDK (TypeScript)
My role — Sole engineer and architect: product design, data modeling, backend, frontend, infrastructure-as-code, and deployment. Built on my own time and hardware.

Code is private (commercial product). Architecture walkthrough available on request — get in touch ↗.