EpiAware EpiAware EpiAware
  • Approaches
    • Overview
    • Composed distributions
    • Composable Turing models
  • Tutorials
  • Docs
  • News
  • Gallery
  • Guides
    • Resources
    • Using Julia
    • FAQ
    • Contributing
    • Developer docs
  • Community
    • Get involved
    • Team
    • Funding
    • epinowcast & the forum
EpiAware Logo EpiAware Logo

Composable tools for infectious disease modelling in Julia.

Composable

Small, interchangeable parts combine into one joint model. Swap a part to test an assumption, keeping a single rigorous model rather than chaining separate ones.

Uncertainty-aware

Uncertainty propagated correctly from the priors through infection dynamics and observation.

Built for response

Nowcasting, forecasting, and scenario modelling from one model definition, with reporting delays and ascertainment built in.

Built on Julia

Built on the work of people who specialise in each piece, rather than as a walled garden. Inference comes from Turing.jl, dynamics from SciML, and automatic differentiation from Mooncake and Enzyme.

Multiple approaches

Aims to support more than one way of composing infectious disease models, kept interoperable. See the approaches we are exploring.

LLM-assisted model building

Named, composable parts give large language models a clear vocabulary to assemble and adapt models from, lowering the barrier to a first analysis.

composed_delays.jl
using ComposedDistributions, Distributions

# BDBV-inspired delay tree: parallel pathways
# with Sequential, Resolve, and Compete nested together
tree = compose((
    clinical = sequential(
        :onset_admit => Gamma(1.2, 3.0),
        :admit_resolve => resolve(
            :death => (Gamma(2.0, 3.5), 0.3),
            :discharge => (Gamma(1.0, 8.0), 0.7))),
    surveillance = sequential(
        :onset_notif => Gamma(0.7, 20.0),
        :notif_compete => compete(
            :confirmed => Gamma(2.0, 1.0),
            :lost => Gamma(5.0, 0.5))),
))

# Inspect tree, params, and default priors
event_tree(tree)
params_table(tree)
priors = build_priors(params_table(tree))

# Draw a synthetic case, or evaluate a real one's likelihood
rand(tree)
logpdf(tree, ans)

Why composable?

Evidence for infectious disease policy has to be timely, rigorous, and collaborative. Today’s approaches force a choice between them, and composability may let us avoid it.

  • Passing results from one model to the next loses information. Each model hands on a summary rather than the underlying evidence, and quietly carries over the assumptions made before it. By the time an answer reaches the person making a decision, nobody can check what that cost.
  • Building one model that does everything is more reliable, but it does not survive the next outbreak. The models built for COVID-19 could not be adapted for mpox, so new ones were written from scratch, and had to make do with a single source of data because answers were needed quickly.
  • We keep rebuilding the same things. At least seven separate software packages estimate how fast a disease is spreading, and none of them share any parts, even where the same people wrote them. What gets reused is the whole model, never the ideas inside it.
  • Composable models could give us both. Build a model from interchangeable parts and it can be as reliable as an all-in-one model while still being quick to adapt. A specialist can contribute the one part they know well without understanding the rest, and when two teams disagree they can see whether it is a real scientific difference or just a difference in the code.

Read the full argument

Core Packages

The EpiAware ecosystem is built on a foundation of powerful, composable packages.

Explore Ecosystem →
ComposableTuringIDModels.jl

Assemble infectious disease models from interchangeable parts as a single Turing model.

CensoredDistributions.jl

Handle the censoring and truncation biases common in epidemiological delay data.

ComposedDistributions.jl

A grammar for composing distributions into event trees.

ModifiedDistributions.jl

Rescale, weight, or modify distributions, keeping the full distribution interface.

Explore Ecosystem →

News & Updates

Read the latest from the EpiAware team.

View more →

A composable ecosystem for infectious disease modelling

Why we are building EpiAware, what we want from it, and what we need.

Jul 10, 2026
No matching items
View more →

Built on Julia

We build in Julia for its type system, multiple dispatch, and automatic differentiation, on top of the scientific infrastructure.

SciML

Differential equations, sensitivity analysis, and scientific machine learning.

Turing.jl

Probabilistic programming and Bayesian inference.

Distributions.jl

The shared vocabulary of probability distributions our packages extend.

New to Julia? Start with the Using Julia guide.

Background

From R to Julia, the story behind EpiAware.

In R we built the epinowcast ecosystem and packages such as EpiNow2 and scoringutils, now used by academics and public health teams internationally. EpiAware is the Julia equivalent, a domain-focused ecosystem in the mould of SciML or Turing.jl, with community infrastructure like rOpenSci and the domain focus of SpeedyWeather.jl.

We are at an early stage and looking for collaborators, and here is how to get involved.

EpiAware — a composable Julia ecosystem for infectious disease modelling.

  • Packages

  • Get involved

  • Funding

  • Edit this page
  • Report an issue