JUNIPER
Large-Scale Outbreak Reconstruction and Analysis

Fathom Information Design

Summer 2025 - Spring 2027

Visual Craft

I designed an outbreak visualization platform that preserves analytical rigor while making potential transmission patterns immediately interpretable and verifiable. Validated with 10+ domain experts, the platform is now in development for broader dissemination and forms the foundation for my senior thesis.

I organized this case study into three chapters, each marking a major evolution in the dashboard:

  • Chapter 1: Designing and iterating the core interface in Figma (Summer 2025)

  • Chapter 2: Developing the platform with real-world data (Fall-Spring 2026)

  • Chapter 3: Expanding the research into my senior thesis (coming soon)

I designed an outbreak visualization platform that preserves analytical rigor while making potential transmission patterns immediately interpretable and verifiable. Validated with 10+ domain experts, the platform is now in development for broader dissemination and forms the foundation for my senior thesis.

I organized this case study into three chapters, each marking a major evolution in the dashboard:

  • Chapter 1: Designing and iterating the core interface in Figma (Summer 2025)

  • Chapter 2: Developing the platform with real-world data (Fall-Spring 2026)

  • Chapter 3: Expanding the research into my senior thesis (coming soon)

Content truncated on mobile. Visit on desktop for the full experience!

CONTEXT

Sole designer

10 weeks

Ongoing development

TOOLS

Figma

R Studio

Cursor

Svelte/JS

SKILLS

Complex Systems

User Trust

Interface Design

Data Viz

CHAPTER 1

Early design explorations

Early design explorations

In Summer 2025, I rapidly iterated through interface designs in Figma, guided by the core questions that scientists ask to surface meaningful insights from their data.

THE PROBLEM

Powerful outbreak insights, limited by technical expertise.

JUNIPER is a statistical framework that uses genetic data from positive patient samples to reconstruct likely transmission links — including cases that might've not gotten tested (Specht et al., 2025).

1

2

3

4

5

6

7

8

9

10

During interviews with scientiests, I learned that while many were excited by the tool’s potential, JUNIPER is run entirely in the R programming language. This creates a large barrier for epidemiologists and public health staff who aren't familiar with writing custom code or navigating raw statistical outputs.

THE GUIDING QUESTION

How do you transform dense code into an interactive tool for exploring outbreak dynamics?

How do you transform dense code into an interactive tool for exploring outbreak dynamics?

After 8 design iterations, I developed an interface with 20+ features and on-demand complexity that aligned with four core goals:

Decrease cognitive load

Speed up insight extraction

Improve usability for non-technical users

Reduce risk of misinterpretation

Impact

BEFORE
AFTER

Static R scripts requiring tedious, manual inspection of resulting data and networks

Visualizations that enable clear identification of superspreaders, clusters, and outbreak dynamics

Slow, code-heavy workflows that limited accessibility and visualization to statistical experts

Multi-modal analysis that significantly reduces time-to-interpretation for all users

"Amazing. This is a clear endpoint for the project’s goals and this is going to be a major resource for the field."

Pardis Sabeti - Lab PI

"Phenomenal prototype. It's a perfect representation of JUNIPER's outputs and parameters."

JUNIPER Developer

"Night and day—much faster to interpret for investigation." "This is needed, this is amazing. People at the DPH (MA Dpt. of Public Health) want this.”

Senior Scientists

PROCESS OVERVIEW

An iterative design cycle

Starting off with a blank slate was intimidating, but I faced the challenge with a structured, iterative approach. My early exploration and user research helped me define both design guidelines and the non-negotiable insights that need to be surfaced.

1

Understand & Define

Combed through papers and ran sample outbreaks

2

User Research

Interviewed lab members and public health workers

3

Feature Ideation

Sketched initial concepts, created a visual user flow

4

Prototyping

Used Figma and AI-assisted prototyping using both simulated and real-world data

5

Usability Testing

Synthesized insights from conversations and interviews with users

User questions informed the system architecture

I collected 30+ user questions from working closely with JUNIPER’s developer and gathering real-world use cases from lab members, members of the MA Dpt. of Public Health, conferences, and scientific literature. This list is ever-evolving, and it’s my basis for ideating, iterating, and weighing design tradeoffs.

What are users interested in exploring through JUNIPER?

  • Are there clusters or patterns?

    Critical

    Central transmission network visualization; summary panel with key outbreak metrics; timeline

  • Who likely infected whom?

    Critical

    Hover/click node to reveal transmission links & metadata

  • How do metadata (like vaccination status) influence outbreak dynamics?

    Critical

    Filter & color nodes by metadata field

  • Who were likely superspreaders?

    High

    Node size scaling by transmission count; sortable node list

  • How many cases were missed in testing?

    High

    Distinct node styling for unsampled cases

  • Are links supported by epidemiological confirmation or contact tracing?

    High

    Color code links by provided epidemiological data

User interviews highlighted guidelines that shaped all my iterations:

1. Consider the complexity of different use cases

Enable both surface-level analysis and deep dives for scientists and epidemiologists.

2. Maintain network scalability

Handle both small (school outbreak) and large-scale (ex: country-wide) networks.

3. Visualize uncertainty

Clearly depict statistical probabilities, as JUNIPER aggregates results from multiple possible networks.

4. Surface key nuances in the algorithm

Visualize unsampled ("untested") cases, genetic data, and indirect transmissions.

5. Ensure web-readiness

Be compatible with eventual deployment alongside other browser-based Fathom tools.

A CRUCIAL FINDING

One tool, two very different ways of thinking

After synthesizing key user questions, it quickly became apparent that I had to separate JUNIPER's user base into two primary groups with different goals:

Biostatisticians

Researchers and geneticists who apply findings in conferences and government briefings

Goal: Uncover population-level patterns, genetic drivers, and key factors behind disease transmission

Public Health Workers

School nurses tracking a high school outbreak; officials investigating suspicious clusters

Goal: Confirm superspreaders and who-infected-whom; understand general outbreak patterns.

DESIGN DECISION #1

Two investigatory workflows → two views

The transmission network visualization should be the star of the show. I aimed to create the visualization that best addressed user questions, and built other features of the interface around it. I explored two primary transmission layouts, realizing that each conveyed unique insights:

Time-Based

“How fast is it spreading? What are key clusters of interest?”

Suited for pattern identification

Radial

“Who were likely superspreaders? Who likely infected whom?”

Suited for superspreader tracing

For each layout, I adjusted various characteristics throughout 15+ network variations to emphasize the most relevant insights about the network.

Level 1 - Superficial, “obvious” details to consider

Node style

Case

Root

Unsampled

Distinguish case identities

Arrow weight & opacity

50%

75%

100%

Visualize transmission uncertainty

Level 2 - Nuances that make a difference

Node & arrow size

Smaller #

Larger #

Emphasize cases with a high # of direct transmissions

Arrow style & length

Direct transmission

Indirect

How can we distinguish direct/indirect transmissions?

Level 3 - More advanced configurations

Vertical spacing

Emphasize clusters

Angular spacing

Emphasize superspreaders

DESIGN DECISION #2

Clear, structured visual hierarchy

With so much information to display, visual hierarchy was paramount. With each iteration I made, I asked myself: how can I strip each view down to what's truly relevant for each user?

Dual page view: supporting two mental models

Dual page view: supporting two mental models

Given the distinct value of each network layout, I designed a dual-view model. Defining clear jobs to be done for each page helped me set focused goals and reconcile tradeoffs between different visualizations.

Given the distinct value of each network layout, I designed a dual-view model. Defining clear jobs to be done for each page helped me set focused goals and reconcile tradeoffs between different visualizations.

During user testing, I found that this approach of splitting the platform into a high-level overview and transmission-focused view was successful in reducing cognitive load for users. I then designed motion transitions to maintain continuity between pages.

Results: High-Level

Job: Understand how the outbreak is evolving and view lineage, cluster, or metadata-specific patterns.

Time-based layout gets the big picture across. Users see outbreak parameters in the right panel.

Link Details: Transmission-Focused

JTBD: Investigate superspreaders and contact tracing or epidemiologically-confirmed links.

Radial layout emphasizes superspreaders. Users can dive into specific cases, sorted by outbreak impact.

On-demand complexity: lowering the barrier to entry

On-demand complexity: lowering the barrier to entry

USABILITY TESTING FINDING

Non-biostatisticians were confused about the purpose of specific parameters as well as how the different networks were aggregated.

With the two primary user groups in mind, I tailored the interface to focus on ensuring accessibility for non-statistical specialists while maintaining depth for expert analysis.

Essential

Essential

Advanced

Advanced

DESIGN DECISION #3

Side nav: an entry point for investigation at scale

In large-scale outbreaks, the cases in the visualization become more cluttered and difficult to navigate. So, I created a structured, easily-accessible way of exploring high-transmission cases.

I created an accessible way of exploring high-transmission cases.

Designing the case cards took several iterations — I aimed to enable quick visual identification while keeping the view clear and uncluttered.

Iteration 1

What does all this technical text mean? Can we make it more visually appealing?

Iteration 2

Replaced jargon with plain language

Are these case cards static, or are they clickable?

Iteration 3

Added outlines and hover interactions

Not all this information seems necessary. Can users view transmissions at a glance?

Iteration 4

Visually represented transmissions

Users can visually compare transmission counts by scanning down the list.

DESIGN DECISION #4

Zoom that adds meaning, not clutter

The most straightforward way to zoom in on a case was simply to provide a labeled, higher-resolution view. But after hearing early feedback, I began to wonder: could this view do more than just magnify? Could it also clarify relationships or even surface new insights?

Iteration 1

Simple zoom-in (with labels)

Easy-to-follow, but doesn't add additional value, especially for smaller networks.

Iteration 2

Organized by relationships

Emphasizes causal links, but may be misinterpreted as time of infection.

Iteration 3

Organized by time

Reintroduces time-based structure, adding more context into infection relationships.

PUTTING IT ALL TOGETHER

Iterate, Iterate, Iterate

The actual journey behind these design decisions wasn’t so linear; it involved a ton of going between paper sketching, whiteboarding, Figma, and coding. It was messy and challenging, but so much fun.

Throughout the project, I sought feedback through demoing and testing with Fathom designers and 10+ lab members.

  • Iteration 1

    Preliminary feature ideation after user interviews, starting from a blank canvas.

    Experimented with different user flows and layouts in a lo-to-mid fidelity wireframes.

  • Iteration 2

    Usability Test: "For larger networks, how do I go about selecting a case? Directly from the graph?"

    Moved into mid-to-hi fidelity versions; added case navigation and network summary details

  • Iteration 3

    Usability Test: "I feel like there's a lot of information I want that isn't being shown here."

    Incorporated large-scale outbreak from paper, added transmission details table

  • Iteration 4

    Usability Test: "Now the interface is getting way too busy — I don't know where to look."

    Introduced dual-view; removed extraneous network preview; moved case nav to the side bar

  • Iteration 5

    Feedback: "This is starting to look like a control panel — there are two many things to click"

    Made clickable buttons clearly clickable; added descriptive labels for two network structures

  • Iteration 6

    Feedback: "What data is truly relevant when exploring real-world outbreaks?"

    Incorporated smaller-scale outbreak from paper; streamlined side case nav; removed central table

  • Iteration 7

    Usability Test: "What exactly is the central network visualization trying to tell me?"

    Brought epi-chart forward; further simplified layout; refined the central networks and zoom-ins

  • Iteration 8

    Usability Test: "I'm not sure how some of these parameters should be interpreted or used"

    Incorporated Essential and Advanced modes to simplify layouts; added interpretation guides

Reflection

Though JUNIPER is a uniquely complex tool, the lessons I learned are broadly applicable to any UX project to craft user-centered, intuitive interfaces:

Simplification is complex

One of the biggest challenges was placing each feature in a logical, accessible location while also trying to reduce clutter. I learned that finding the right balance between simplicity and scientific complexity often involves making thoughtful tradeoffs based on rigorous user testing.

There's no universally perfect solution.

Designing for public health requires constant consideration of accuracy and trust—the way something is presented can literally mean the difference between life and death. In this context, defaulting to clarity and protecting against misinterpretation proved to be the most responsible path.

Progress isn't linear.

After so many of iterations, I sometimes felt discouraged, only to realize that an idea from an earlier iteration could actually be the best fit later on. Iteration keeps the door open for rediscovery and refinement!

CHAPTER 2

From prototype to real-world data

From prototype to real-world data

The first version of JUNIPER was designed around simplified datasets. Working with code and real-world epidemiological data quickly exposed flaws in the mental model, which forced me to rethink the visualization and surrounding UI.

Rather than treating the central network as just another feature, I restructured the platform around it as the primary investigative tool. This allowed me to explore how JUNIPER could support investigation at different scales while simultaneously testing whether the underlying interaction model was technically feasible for the MVP.

WIP demo: Some features are still in progress, and artifacts from testing remain.

Working with messy data

When I started working on development, the initial layout looked clean with small outbreaks.

Figma

Code

But when I plugged in a variety of real-world datasets, things took a turn for the worse. Incomplete sampling and irregular transmission patterns exposed limitations that weren’t visible in Figma.

Cases began to overlap and relationships became difficult to trace, especially for larger outbreaks.

Cleaning the network up

I added toggles directly into the interface to rapidly evaluate transmission layouts based on how well they supported investigation—not just how they looked in a static mockup. I chose the tree structure that best balanced scalability and interpretability.

Once I had the overall structure down, I focused on refining the visual polish. In particular, I spent time figuring out how to represent indirect transmissions—when one or more cases between two people in the transmission chain were not captured in the dataset. While these connections are less certain than direct transmissions, they provide important context for understanding the outbreak, especially when only a small portion of cases have been sampled.

Elbow connectors

Broke up visual hierarchy and made dense networks difficult to scan.

Dotted curved lines

Reduced visual weight but introduced distracting artifacts.

Solid curved lines

Cleaner but provided too much emphasis on indirect transmissions.

Further refinements

I experimented with spacing and color to emphasize direct transmissions and reveal clusters.

Rebuilding the interface around the centerpiece

Once the visualization became the focal point, I reworked the surrounding interface to support investigation rather than compete with it. I also simplified the existing interface to prioritize the core investigative workflow and keep the MVP feasible within our technical and timeline constraints.

1

2

3

4

5

6

7

Full UI

1

2

3

4

1

2

3

4

Finding

Transmission links filtering was just a concept. Further, not showing details about probability in the left panel could make users mistake probabilistic relationships for confirmed transmissions.

What I changed

I removed the link coloring option and introduced filters that let users directly adjust the uncertainty threshold, making the confidence of each relationship explicit.

Designing for scale

Large outbreaks introduced a second challenge: how do you preserve a useful mental model when the network grows from dozens to hundreds or thousands of cases?

I explored ways to reduce visual clutter without hiding information users might need to investigate an outbreak. This meant balancing density with readability, and detail with progressive disclosure through interaction.

Iteration 1

On hover, users see every possible transmission, including those below the probability threshold.

This created significant visual clutter.

Iteration 2

I simplified the interaction to show only the number of possible infectors and infectees. This reduced clutter, but now users lack enough context.

Final iteration

I combined the two approaches. Users see a summary of possible infectors and infectees, along with which connections fall below the threshold—providing context without overwhelming the view.

Reflection

This phase fundamentally changed how I approached prototyping. Figma helped me establish the interaction model, but real data exposed problems that static prototypes couldn't. I used code to test those ideas against real-world edge cases, moving continuously between design → implementation → observation → redesign.

The result was not simply a higher-fidelity version of the original concept. The implementation changed the design itself.

Real data is the ultimate design critique.

Designing with simplified data made it easy to create a clean interface. Working with real outbreaks forced me to confront the messy reality behind the model, and rethink decisions I had considered settled.

AI accelerates exploration; it doesn't replace judgment.

AI-assisted prototyping made it dramatically faster to test network structures and interaction ideas, but it couldn’t solve the core design problem. Because JUNIPER explored novel research with no established interface patterns, AI-generated designs offered little useful precedent. I developed the visualization and interaction model from scratch, making the core decisions around what to communicate and which tradeoffs to make.

Technical fluency changed how I designed.

Writing pseudocode and working directly with the underlying data structures for the visualization helped me understand constraints that wouldn’t be visible in Figma alone. I learned to design not just what the system should do, but apply my learnings from CS classes to determine how it could actually work under the hood.

CHAPTER 3

Designing for uncertainty

Designing for uncertainty

Outbreak reconstruction is inherently uncertain: probabilistic inference and incomplete transmission histories make definitive answers impossible.

Building on this work, my senior thesis in Computer Science (Mind, Brain, and Behavior) explores the question:

How might we help experts reason through uncertainty instead of around it?

I’m investigating different approaches to visualizing uncertainty and testing how they affect the way epidemiologists interpret and reason about transmission patterns.

More to come!

Acknowledgements

I’m grateful to have had the privilege of receiving mentorship and feedback from Ben Fry, Pardis Sabeti, Ivan Specht, Chase Van Amburg, Karlie Zhao, Paul Cronan, Taylor Brock-Fisher, Lydia Krasilnikova, and other members of the Sabeti Lab over the course of this project.

© 2026 Xinyi Christine Zhang