Back to portfolio
Case Study

QuicLens

A multi-tenant, cloud-native analytics platform for research labs - engineered and deployed as the sole developer, from data model and authorization rules to React interface and AWS infrastructure.

The source code is private. This case study covers the architecture and engineering decisions.
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) with hand-built SVG charts for the fluorescence-kinetics and dose-response visualizations, 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 tables and GSIs store organization, lab, project, plate, membership, and audit data; an encrypted, versioned S3 bucket retains archived plate records.

Auth - WorkOS AuthKit verifies identity. The backend resolves the active organization/lab and enforces membership, role, and resource-level authorization before tenant-scoped operations execute.

Infrastructure - AWS CDK (TypeScript). The entire stack - buckets, distribution, Lambda, API Gateway, IAM policies, and frontend deployment - is reproducible from code.

Infrastructure evolution

QuicLens did not start on its current AWS platform. The first hosted version used Vercel for the React frontend and Railway for the FastAPI backend. I later re-platformed the application onto AWS: the frontend moved to a private S3 origin behind CloudFront, while the API moved to a container-image Lambda behind API Gateway, with the platform defined in AWS CDK v2.

The migration removed the Vercel/Railway deployment dependency while preserving the application model and making the current infrastructure reproducible in 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?

The workload is dominated by known, key-based access patterns across organizations, labs, projects, plates, and results. DynamoDB provides predictable performance, on-demand scaling, GSIs for targeted lookups, and point-in-time recovery. Tenant authorization is enforced in the application layer rather than delegated to IAM or a partition key.

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

Identity and authorization are deliberately separated. WorkOS verifies the user; application-owned organization and lab memberships establish tenant context; role checks and resource-level access rules govern reads and writes, including cross-lab sharing. The development history also includes explicit hardening of auth and cross-tenant data paths surfaced during self-audits.

Testing & reliability

Stack at a glance

LayerTech
FrontendReact, TypeScript, Vite, Tailwind, custom SVG charts
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.