Full-Stack Solo Designer & Full-Stack Developer

Research Data
Automation
Tool

UX researchers at Labcorp were spending hours manually merging Excel exports from multiple study waves. I saw the problem, designed the solution from scratch, and built UnifyUXR — a full-stack Angular app that handles the whole process. Researchers upload their files and get the combined results in seconds.

Role
Solo — research, design, code, and deployment
Timeline
Built 2024 – 2025 · still in regular use
Users
5 UX researchers, plus additional designers
Stack
Angular · TypeScript · ExcelJS · Docker · K8s · Jenkins
Seconds
To merge study waves that took hours by hand
1
Person: research, design, code, and deployment
3
Infra layers: Docker, Kubernetes, Jenkins CI/CD
In active use by Labcorp UX research team
01 — The problem

A multi-hour manual process for a solvable problem

Labcorp's UX research team runs studies in multiple waves. Each wave produces an Excel export. Combining those exports into a single set of results required manually copying data across spreadsheets, applying weighted average calculations by hand, and then formatting everything for presentation. It took hours and was prone to error.

This is exactly the kind of task that software should handle. The logic is well-defined, the inputs are consistent, and the output format is always the same. I asked if anyone had tried to automate it. Nobody had.

I volunteered to build it.

02 — Live demo

Watch three mismatched exports become one answer

The hard part was never the arithmetic — it was that no two exports line up. Questions get renamed between waves, a question gets dropped, and every wave has a different number of respondents. That's what made this a multi-hour job with a real chance of a copy-paste error.

Below are three exports with exactly those problems. Hit merge and watch the app resolve them.

wave1_export.xlsx
42 respondents · 5 questions
  • Ease of completing core task
  • Clarity of results screen
  • Confidence in the data
  • Navigation findability
  • Overall satisfaction
Baseline schema
wave2_export.xlsx
38 respondents · 4 questions
  • Ease of completing core task
  • Clarity of results screen
  • — question not asked —
  • Navigation findability
  • Overall satisfaction
Missing a question
wave3_final_v2.xlsx
51 respondents · 5 questions
  • Task ease
  • Clarity of results screen
  • Confidence in the data
  • Findability
  • Overall satisfaction
2 questions renamed

3 files ready · 131 respondents total

  1. Parse workbooks
  2. Normalize question labels
  3. Align across waves
  4. Weight by respondent count

Fictional study data, but the mismatches are the real ones: renamed questions, dropped questions, and uneven sample sizes. The production app parses actual Excel exports with ExcelJS.

03 — Process

Designed and built by one person

1
Research and Problem Definition

I sat with UX researchers and watched them do the manual process. I asked questions about edge cases, which study configurations they used most, and what the output needed to look like. The goal was to understand the real problem before writing a single line of code.

2
UX Design

I designed the interface in Figma before building anything. The main question was how to make file upload and configuration feel simple for researchers who do not have a technical background. The answer was a three-step flow: upload files, configure wave weights, get results.

3
Frontend Build

I built the Angular frontend following the Figma designs. The app uses reactive forms for the configuration step and Chart.js to render the combined results as interactive visualizations that researchers can explore.

4
File Processing Logic

I used ExcelJS to parse the uploaded files, extract the response data, and apply weighted average calculations across waves. The logic handles variable question sets between waves and multiple response scale formats.

5
Deployment

I containerized the app with Docker and deployed it to Labcorp's Kubernetes infrastructure using Helm charts and a Jenkins CI/CD pipeline. The same pipeline handles updates — I push a change and it deploys automatically.

04 — Technical stack

Full-stack from design to deployment

Frontend
Angular TypeScript Chart.js ExcelJS SCSS
Infrastructure
Docker Kubernetes Helm Jenkins CI/CD
wave-merger.service.ts — weighted average across study waves
mergeWaves(waves: WaveData[], weights: number[]): MergedResult { const totalWeight = weights.reduce((sum, w) => sum + w, 0); return waves[0].questions.map((question, qIndex) => { const weightedAvg = waves.reduce((sum, wave, wIndex) => { const score = wave.questions[qIndex].meanScore; return sum + (score * weights[wIndex]); }, 0) / totalWeight; return { questionId: question.id, questionText: question.text, weightedMean: Math.round(weightedAvg * 100) / 100, waveScores: waves.map(w => w.questions[qIndex].meanScore), }; }); }
05 — Outcome & impact

Hours to seconds

Results
Hours of manual work replaced

Researchers upload their files and the app returns combined results in seconds. The whole manual process — copying, calculating, formatting — is gone.

Interactive visualizations included

The results don't just appear as a table. Chart.js renders interactive bar charts that researchers can explore before exporting, which makes the analysis step faster too.

Deployed to production infrastructure

The app runs on Labcorp's Kubernetes cluster with a full Jenkins CI/CD pipeline. It gets updates like any other production service.

Designed and built by one person

From the first conversation with researchers through to the deployed app, this was a solo project. Design, frontend, processing logic, containerization, deployment — all of it.

← Back to all work Back to first project Enterprise UX Design →