A roadmap, challenges, and questions
London School of Hygiene & Tropical Medicine
14 August 2026
samabbott.co.uk/JuliaCon2026/roadmap
JuliaCon 2026, Muschel — N3, Friday 14 August 2026, 14:30.
BVDOutbreakSize, first commit 2026-05-19 with 33 that day, read 2026-08-13 from the clone at 90df658d · figures from the WHO collaboratory talk of 10 June 2026, fitted to data as of 7 June · situation reports from insp.cd · McCabe et al., Estimation of the size of the outbreak of Ebola disease caused by Bundibugyo virus in DRC, Imperial College London, 18 May 2026, doi:10.25560/130007.
About 35,000 lines of Julia across src, test, scripts, ext and docs, counted 2026-08-13 · the Enzyme comparison is BVDOutbreakSize#445, open at 2026-08-12.
epiaware.org, read 2026-08-13.
ComposableTuringIDModels.jlTuring.jl. Transmission, latent process and observation are separate objects that nest into one modelTuring toolchain come with itepiaware.org/approaches/composable-turing-models, read 2026-08-13, comments trimmed to fit · ComposableTuringIDModels.jl
using ComposableTuringIDModels, Distributions, Turing, Mooncake
using ADTypes: AutoMooncake
renewal = Renewal(;
generation_time = Gamma(1.4, 1 / 0.38),
rt = AR(; ϵ_t = HierarchicalNormal(std = HalfNormal(0.1))),
initialisation = Normal(log(1.0), 1.0))
obs = LatentDelay( # delay → ascertainment → noise
Ascertainment(NegativeBinomialError(),
Intercept(Normal(log(0.4), 0.1))),
truncated(Normal(5.0, 2.0), 0.0, Inf))
model = IDModel(renewal, obs)
chain = sample(as_turing_model(model, cases, length(cases)),
NUTS(0.95; adtype = AutoMooncake(; config = nothing)),
MCMCThreads(), 100, 2)ComposedDistributions.jlDistributions.jlconvolve_series pushes a time series through the tree, and it marginalises across the tree where that is cheaperlower turns a delay into a compartmental generator, over Catalyst, SciMLBase, JumpProcesses and AlgebraicPetriepiaware.org/approaches/composed-distributions, read 2026-08-13, comments trimmed to fit · ComposedDistributions.jl · LoweredDistributions.jl README, read 2026-08-10.
using ComposedDistributions, Distributions
tree = @uncertain compose(( # parallel pathways, nested
clinical = sequential(
:onset_admit => Gamma(Normal(1.2, 0.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))),))
event_tree(tree) # the tree,
params_table(tree) # its parameters,
priors = param_priors(tree) # and its default priors
case = rand(tree)
logpdf(tree, case)epinowcast, its community forum and seminar seriesTuring.jlSciMLrOpenSciSpeedyWeather.jlComrade.jlHydroModels.jlcommunity.epinowcast.org and epinowcast.org/seminars, read 2026-08-11 · SciML governance and rOpenSci software review, read 2026-08-11.
| Package | Since | Stars | CRAN |
|---|---|---|---|
EpiNow2 |
2020 | 141 | 58,073 |
epinowcast |
2021 | 67 | not on CRAN |
epidist |
2023 | 16 | not on CRAN |
primarycensored |
2024 | 9 | 11,294 |
baselinenowcast |
2025 | 10 | 1,678 |
Stars and creation dates from the GitHub API, downloads are CRAN totals to 2026-08-11 from cranlogs, retrieved 2026-08-12, and baselinenowcast 2026-08-13.
epinowcast was the attempt at community developed toolsA workflow for infectious disease modelling, Abbott et al.
“We have been applying for funding to do it. So far without success”, the EpiAware announcement post, news/posts/hello-epiaware.qmd on epiaware.org, published 2026-07-10, read 2026-08-12.
All of my organisations, seabbs-bot only, January to July 2026 · EpiAware counts from gh api search/issues, read 2026-08-10.
.github.github repository, as SciML does itrelease-nudge opens a tracking issue when a package has unreleased changes, and closes it again when it does nottry-this-pr comments install instructions on every pull request
.github/workflows/test.yaml in ComposableTuringIDModels.jl, SHA abridged, read 2026-08-12 · 22 of the 23 workflows in EpiAware/.github declare workflow_call, counted from the contents API 2026-08-13 · template-sync.yaml runs Monday 04:00 UTC.
EpiAwarePackageTools.jlscaffold writes the tooling into a package once. update re-applies it and reports driftAqua, JET, formatting, docstrings and benchmarksAGENTS.md and CLAUDE.md so a model can find the docsImportant
We should probably have built this on BestieTemplate.jl’s Copier template rather than writing our own scaffolder.
src/ and templates/ in EpiAwarePackageTools.jl, counted at commit 427d4f5 on main, 2026-08-12 · ten of the eleven Julia packages carry template-sync.yaml on main, checked through the contents API 2026-08-12 · BestieTemplate.jl and PkgTemplates.jl.
CRAN has more checks than comparable package serversAqua, which is greatJET, docstring format, doctests, README sections, import centralisation, formatting and benchmarks@testitem "Quality: Aqua"
@testitem "Quality: ExplicitImports"
@testitem "Quality: import centralisation"
@testitem "Quality: docstring format"
@testitem "Quality: README sections"
@testitem "Quality: doctest"
@testitem "Quality: formatting"
@testitem "Quality: linting (JET)"
@testitem "Quality: extension ambiguities"templates/test/package/quality.jl in EpiAwarePackageTools.jl, written into each adopting package and overwritten on every sync, read 2026-08-12.
R CMD check before you update. Julia has no equivalentCRAN Repository Policy, read 2026-08-12 · downstream.yaml and the downgrade-compat job read through the contents API across the ten packages that carry them, 2026-08-12 · SciML’s Downstream.yml in OrdinaryDiffEq.jl runs ProbNumDiffEq.jl and PositiveIntegrators.jl, read 2026-08-10.
DifferentiationInterfaceTestSpecialFunctions.jl the shape-parameter partials of gamma_inc and beta_inc are not implemented, so support is janky across backendsEpiAwareADTools.jl stores our org-wide automatic differentiation fixes, and aims to delete each one when upstream ships itNote
Is there a guide for any of this anywhere in the Julia ecosystem? I went looking and did not find one.
src/ad_harness.jl:157-168 in EpiAwarePackageTools.jl, read 2026-08-13 · DifferentiationInterface.jl is by Guillaume Dalle, with Adrian Hill · DifferentiationInterfaceTest.jl · the missing rules are SpecialFunctions.jl issue #531, and the replacements are in src/gamma_ad.jl in EpiAwareADTools.jl, read 2026-08-13.
DocStringExtensions gets us close to R’s standard. I would like moreSciML puts something interesting on the front page and keeps the tutorials short. We copy thattemplates/src/docstrings.jl in EpiAwarePackageTools.jl, written into every package and paired with test_docstring_format, read 2026-08-13 · DocStringExtensions.jl.
EpiAwareAgents is one possible answer, a community bot any maintainer could point at their own repository🤖 🤖 🤖 🤖 🤖 🤖
🤖 🤖 🤖 🤖 🤖 🤖
🤖 🤖 🧑💻 👩💻 🤖 🤖
🤖 🤖 🤖 🧑🔬 🤖 🤖
🤖 🤖 🤖 🤖 🤖 🤖
🤖 🤖 🤖 🤖 🤖 🤖
EpiAwareAgents README and DESIGN.md, read 2026-08-12 · no open good first issue in the org from gh search issues, and the most recent outside commit is 2026-02-03 from git log on main, both 2026-08-12.
JuMP governance, SciML governance and TuringLang’s contributing guidance, read 2026-08-10, with no governance document in any TuringLang repository, searched 2026-08-12.
Please send help!
EpiAwarePackageTools.jl and EpiAwareADTools.jlsamabbott.co.uk/JuliaCon2026/roadmap
Sam Abbott, LSHTM · epiaware.org · github.com/seabbs