diff --git a/README.md b/README.md
index d19a7d0..be127a2 100644
--- a/README.md
+++ b/README.md
@@ -7,30 +7,31 @@
This repository is used for coordinating all the software development
activities by the ForeSITE group.
-The list includes 45 tools. A complete list featuring completed and
-work-in-progress tools holds 60 entries. We will be updating this list
+The list includes 48 tools. A complete list featuring completed and
+work-in-progress tools holds 63 entries. We will be updating this list
as we progress.
| | Type | N |
|:----|:----------------------------------------------------------|----:|
-| 5 | Epidemic Model - Scenario Modeling | 21 |
-| 8 | Parameter estimation | 12 |
-| 2 | Decision Support tool | 2 |
+| 5 | Epidemic Model - Scenario Modeling | 22 |
+| 9 | Parameter estimation | 12 |
+| 2 | Decision Support tool | 3 |
| 3 | Developer Tool | 2 |
| 6 | Epidemic Model - Scenario Modeling & Parameter estimation | 2 |
| 1 | Automation pipeline tool | 1 |
| 4 | Epidemic Model - Forecasting | 1 |
| 7 | Nowcasting tool | 1 |
-| 9 | Statistical Model - Forecasting | 1 |
+| 8 | Parameter estimation | 1 |
+| 10 | Statistical Model - Forecasting | 1 |
Number of software packages by type
| Language | N |
|:---------|----:|
-| r | 25 |
+| r | 27 |
| Other | 11 |
-| python | 7 |
-| c++ | 3 |
+| python | 8 |
+| c++ | 4 |
| anylogic | 2 |
| matlab | 2 |
| sas | 2 |
@@ -41,14 +42,14 @@ Number of software packages by programming language.
# Existing software packages
List of existing software packages that are being used by the ForeSITE
-group. This list was last updated on 2025-08-14.
+group. This list was last updated on 2026-08-14.
| N | Tool | Description |
|---:|:---|:---|
| 1 | Airborne release of infectious pathogens simulator (R) | Estimate airborne dispersal, human exposure, and infection probabilities and timelines after a release of a quantity of infectious organisms. Scenarios(s) Modeled: Airborne release and human inhalational exposure and infection, similar the Sverdlovsk anthrax leak of 1979.
([Learn more…](profiles.md#airborne-release-of-infectious-pathogens-simulator))
|
| 2 | Attention-Based Models for Snow-Water Equivalent Prediction (Python) | Transformer architectures for spatio-temporal prediction (or synthetic data generation/imputation). Scenarios(s) Modeled: Predicting the SWE value for multiple SNOTEL locations in the Western US using the Attention Models
([Learn more…](profiles.md#attention-based-models-for-snow-water-equivalent-prediction))
**GitHub:** [](https://github.com/Krishuthapa/SWE-Attention) |
| 3 | Bayesian Transmission Model (C++) | Provides estimates for critical epidemiological parameters that characterize the spread of bacterial pathogens in healthcare settings. Parameter estimated: Transmission rate (frequency-dependent or density-dependent mass action), importation probability, clearance rate (loss of colonization per colonized person per unit time), surveillance test sensitivity, surveillance test specificity, effect of covariate on transmission (multiplier in relation to overall transmission rate).
([Learn more…](profiles.md#bayesian-transmission-model))
**GitHub:** [](https://github.com/EpiForeSITE/bayesian-transmission) |
-| 4 | Branching process outbreak simulator (R) | Quantifies risk posed by individual importers of a novel transmissible pathogen to a generic population, with intervention effects. Scenarios(s) Modeled: Novel introduction of transmissible pathogen by infected traveler, by accidentally infected laboratory worker, or similar scenario; intervention scenarios for improved detection of initial case and for delayed mitigation after ongoing outbreak is detected.
([Learn more…](profiles.md#branching-process-outbreak-simulator))
**GitHub:** [](https://github.com/EpiForeSITE/branching_process/) |
+| 4 | Branching process outbreak simulator (R) | Quantifies risk posed by individual importers of a novel transmissible pathogen to a generic population, with intervention effects. Scenarios(s) Modeled: Novel introduction of transmissible pathogen by infected traveler, by accidentally infected laboratory worker, or similar scenario; intervention scenarios for improved detection of initial case and for delayed mitigation after ongoing outbreak is detected.
([Learn more…](profiles.md#branching-process-outbreak-simulator))
**GitHub:** [](https://github.com/EpiForeSITE/branching_process/) |
| 5 | Carriage duration estimation from serial testing data (R) | Estimate the duration and heterogeneity of individuals’ colonization episodes for organisms of interest. Parameter estimated: Average and distribution of clearance rate(s) across multiple candidate model forms, average (re)acquisition rate, sensitivity/specificity of testing. Estimates derived via maximum likelihood techniques.
([Learn more…](profiles.md#carriage-duration-estimation-from-serial-testing-data))
|
| 6 | Competing Risks (SAS) | Estimating a competing risks mixture model, which provides both the odds ratio of one event occurring vs. another as well as a marginal estimate of the time to both respective events. Parameter estimated: Odds ratio of two different events occurring and the time to event estimate for both events.
([Learn more…](profiles.md#competing-risks))
|
| 7 | COVID-19 Jail Model (R) | Deterministic model of a stylized jail, with a number of potential interventions developed in collaboration with the ACLU. Scenarios(s) Modeled: Decarceration, social distancing, targeted or widespread arrest reduction, isolation.
([Learn more…](profiles.md#covid-19-jail-model))
**GitHub:** [](https://github.com/epimodels/COVID19-Jails) |
@@ -58,37 +59,40 @@ group. This list was last updated on 2025-08-14.
| 11 | Cumulative infection (R, SAS) | We’ve used Mortality Mapping (mMAP), an existing epidemiologic and statistical analysis approach by Lu et al. \[1,2\] to estimate the cumulative incidence of symptomatic COVID-19 in Veterans in the United States. mMAP is a time series deconvolution method which infers the true COVID-19 case counts from reported COVID-19 deaths. It uses symptom onset to death distribution, smoothed time series of reported COVID-19 deaths, and symptomatic case fatality rate (sCFR) to estimate the distribution of symptomatic COVID-19 cases. We focus on the adjusted version of the mMAP approach presented by Lu et al., which tries to account for the unreported COVID-19 deaths. While Lu uses excess influenza and pneumonia deaths to account for unreported COVID-19 deaths, we have extended their approach by using excess all-cause deaths.
([Learn more…](profiles.md#cumulative-infection))
|
| 12 | DEDiscover (differential evolution) (Kotlin, C++.) | Parameter estimation using differential evolution.
([Learn more…](profiles.md#dediscover-differential-evolution))
|
| 13 | Dose-response estimators for infection risk (R) | Estimate infection probability from a given dose of exposure using data sets from experimental dose-quantified exposures of humans or animals; model-based results used to perform quantitative risk assessment for potential human exposure scenarios. Parameter estimated: Per-unit-dose infection probability and associated additional parameters for more complicated dose-response models, including those that quantify dose-dependent latent/incubation period; can convert estimates to common “infectious dose” quantification metrics such as “ID-50.” Estimates derived via maximum likelihood for multiple equation-based dose-response models fit to exposure-response data.
([Learn more…](profiles.md#dose-response-estimators-for-infection-risk))
|
-| 14 | epitraxr: Manipulate Epitrax Data And Generate Reports (R) | R package for manipulating Epitrax data and generating reports. This tool is designed to simplify the process of working with Epitrax data, making it easier for public health professionals to analyze and report on disease surveillance data. It generates internal and public reports in CSV, Excel, or PDF formats.
([Learn more…](profiles.md#epitraxr-manipulate-epitrax-data-and-generate-reports))
**GitHub:** [](https://github.com/EpiForeSITE/epitraxr) |
-| 15 | epiworld: Fast Agent-Based Epi Models (R, C++, Python, Webessembly) | A flexible framework for Agent-Based Models (ABM), the ‘epiworldR’ package provides methods for prototyping disease outbreaks and transmission models using a ‘C++’ backend, making it very fast. It supports multiple epidemiological models, including the Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), and others, involving arbitrary mitigation policies and multiple-disease models. Users can specify infectiousness/susceptibility rates as a function of agents’ features, providing great complexity for the model dynamics. Furthermore, ‘epiworldR’ is ideal for simulation studies featuring large populations.
([Learn more…](profiles.md#epiworld-fast-agent-based-epi-models))
**GitHub:** [](https://github.com/UofUEpiBio/epiworld) |
-| 16 | epiworld-forecasts: Automatic Disease Forecasting with epiworldR (R) | epiworld-forecasts uses epiworldR, GitHub Actions, and Docker to generate disease forecasts that update automatically. While we provide an example forecast of COVID-19 case counts in Utah, this tool is an open-source, template repository that can easily be adapted to generate forecasts for different diseases.
([Learn more…](profiles.md#epiworld-forecasts-automatic-disease-forecasting-with-epiworldr))
**GitHub:** [](https://github.com/EpiForeSITE/epiworld-forecasts) |
-| 17 | epiworldpy: A python wrapper for epiworld (Python) | A flexible framework for Agent-Based Models (ABM), the ‘epiworldR’ package provides methods for prototyping disease outbreaks and transmission models using a ‘C++’ backend, making it very fast. It supports multiple epidemiological models, including the Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), and others, involving arbitrary mitigation policies and multiple-disease models. Users can specify infectiousness/susceptibility rates as a function of agents’ features, providing great complexity for the model dynamics. Furthermore, ‘epiworldR’ is ideal for simulation studies featuring large populations.
([Learn more…](profiles.md#epiworldpy-a-python-wrapper-for-epiworld))
**GitHub:** [](https://github.com/UofUEpiBio/epiworldpy) |
-| 18 | GeoCovid (R) | Shiny App for visualizing mobility data and COVID-19 cases in Buenos Aires province during March to December 2020.
([Learn more…](profiles.md#geocovid))
**GitHub:** [](https://github.com/Fernandez-Lab-WSU/geocovid_app) |
-| 19 | H1N1 Pandemic Data Estimation (TBD) | Describes an SIR model parameter estimation with an improved fit using least squares estimation over maximum likelihood estimation. Parameter estimated: Transmission rate, recovery rate, R0, number of initial infectives
([Learn more…](profiles.md#h1n1-pandemic-data-estimation))
|
-| 20 | Healthcare facility network outbreak simulator (Anylogic) | Provides flexible framework for agent-based simulation of outbreaks among in-patients in a generic-but-realistic network of short/long-stay hospitals and nursing homes, as well as interventions to mitigate transmission and inter-facility spread. Scenarios(s) Modeled: Initial invasion of new pathogen / strain and/or endemic pathogens. Intervention scenarios for patient-targeted efforts including surveillance and isolation (contact precautions), vaccination, and anti-microbial drug treatment.
([Learn more…](profiles.md#healthcare-facility-network-outbreak-simulator))
|
-| 21 | Healthcare transmission epidemiology estimation at equilibrium (R) | Estimate the extent of patient-to-patient transmission and other quantities using admission prevalence and cross-sectional point-prevalence data for carriage of organisms among healthcare facility in-patients. Parameter estimated: Patient-to-patient transmission rate, facility reproduction number, rate of progression to infection, intervention effects if applicable. Estimates derived via solving differential equations at equilibrium and facility reproduction number equations.
([Learn more…](profiles.md#healthcare-transmission-epidemiology-estimation-at-equilibrium))
|
-| 22 | Herpes Vaccine Model (Matlab) | An ODE-based 6-compartment SI model with asymptomatic carriers and vaccinated classes to forecast the number of infections prevented with imperfect vaccination and infections prevented per vaccine administered. Parameter estimated: Highly correlated parameters determined using LHS PRCC. Scenarios(s) Modeled: Prophylactic (pre-exposure) vaccines, Therapeutic (post-exposure) vaccines, Parameter(s) Estimated: Highly correlated parameters determined using LHS PRCC
([Learn more…](profiles.md#herpes-vaccine-model))
|
-| 23 | HIV End Stage Kidney Disease Epidemic Model (Coded in Matlab, Berkeley Madonna, or Excel.) | An ODE-based model to predict future disease prevalence given the impact of drug therapy levels and its mechanism of action (i.e., stopping progression to disease or reducing deaths). Parameter estimated: Growth rate, death rate, drug efficacy to block disease progression. Scenarios(s) Modeled: Rebound in prevalence due to insufficient therapy (e.g., like in Paxlovid rebound).
([Learn more…](profiles.md#hiv-end-stage-kidney-disease-epidemic-model))
|
-| 24 | Household epidemiology estimation from antibody data (R) | Simultaneously estimate household importation risk, household secondary attack rate, and associated variability / heterogeneities using point-prevalence data for antibody positivity among household members. Parameter estimated: Household importation probability, household secondary attack rate, sensitivity / specificity of data for indicating prior infection, variability (dispersion) in transmissibility, and heterogeneities in those quantities over age and/or other identifiable characteristics of individuals and households. Estimates derived via maximum likelihood for final household outbreak size equations.
([Learn more…](profiles.md#household-epidemiology-estimation-from-antibody-data))
|
-| 25 | Household transmission simulator (R) | Simulate household importation and within-household transmission across a population of households, and intervention effects, e.g. vaccination. Scenarios(s) Modeled: Household importation and transmission with variability in transmissibility and heterogeneity across age groups and vaccination status.
([Learn more…](profiles.md#household-transmission-simulator))
|
-| 26 | Impact of school opening model on SARS-CoV-2 community incidence and mortality (Stata) | The goal of this statistical analysis was to compare SARS-CoV-2 community incidence and mortality rates across schools that opened in in-person, remote, or hybrid mode. Measure(s) of Economic Impact: Infections and mortality
([Learn more…](profiles.md#impact-of-school-opening-model-on-sars-cov-2-community-incidence-and-mortality))
|
-| 27 | linkeR: Effortless Linked Views for Shiny Applications (R) | linkeR makes it effortless to create linked views in Shiny applications. When users interact with one component (like clicking a map marker), all related components (tables, charts, other maps) automatically update to show corresponding information.
([Learn more…](profiles.md#linker-effortless-linked-views-for-shiny-applications))
**GitHub:** [](https://github.com/EpiForeSITE/linkeR/) |
-| 28 | Long-term acute care hospital (LTACH) intervention model (R) | Provides analytic framework for investigating patient-focused interventions to prevent transmission in high-risk healthcare facilities and their direct and population-level health impacts and threshold effects. Scenarios(s) Modeled: Intervention scenarios for surveillance and isolation (contact precautions), decolonization drugs, infection treatment, horizontal transmission reduction, and length of stay reduction.
([Learn more…](profiles.md#long-term-acute-care-hospital-ltach-intervention-model))
|
-| 29 | Monolix (Monolix can be used either via a graphical user interface (GUI) or a command-line interface (CLI) for powerful scripting. R package available) | Parameter estimation in non-linear mixed effect models. Parameter estimated: Any.
([Learn more…](profiles.md#monolix))
|
-| 30 | Multigroup Vaccine Model (R) | A tool for exploring the effects of varying rates of vaccination among disparate socio-economic groups
([Learn more…](profiles.md#multigroup-vaccine-model))
**GitHub:** [](https://github.com/EpiForeSITE/multigroup-vaccine) |
-| 31 | Multitask Model to Forecast Patient’s Next Unit and Remaining Length of Stay (Python) | Length of Stay prediction and unit transfer prediction tool. Scenarios(s) Modeled: In this multi-task learning model, we train the model to predict:Task-1: patient’s unit label in next time step. Task-2: patient’s remaining length of stay.The model inputs get updated on a daily basis and generates prediction accordingly.
([Learn more…](profiles.md#multitask-model-to-forecast-patient-s-next-unit-and-remaining-length-of-stay))
**GitHub:** [](https://github.com/madhobi/multitask_unit_and_days) |
-| 32 | Net financial impact of halting elective admissions (Stata) | The goal of this model was to estimate the net financial impact to the hospital of halting elective admissions due to a COVID-19 surge. Measure(s) of Economic Impact: Hospital profit
([Learn more…](profiles.md#net-financial-impact-of-halting-elective-admissions))
|
-| 33 | Nowcasting (TBD) | Given the time lag between laboratory testing for disease and eventual reporting, we’ve developed a model which consumes data from both community and VA to predict “now” how many positive tests for a disease (COVID-19 in this context) will eventually be reported as positive. A VA HSR&D abstract is available.
([Learn more…](profiles.md#nowcasting))
|
-| 34 | PhenoMapper: an interactive toolbox for the visual exploration of phenomics data (PhenoMapper extension) | TDA tool that can possibly help us to view some trajectory data. Scenarios(s) Modeled: We demonstrate the utility of this new tool on real-world plant (e.g., maize) phenomics datasets.
([Learn more…](profiles.md#phenomapper-an-interactive-toolbox-for-the-visual-exploration-of-phenomics-data))
**GitHub:** [](https://github.com/tdavislab/PhenoMapper) |
-| 35 | POMP (Aaron King’s tool, U. of Michigan) (R) | Analysis of time series data based on stochastic dynamical systems models
([Learn more…](profiles.md#pomp-aaron-king-s-tool-u-of-michigan))
**GitHub:** [](https://github.com/kingaa/pomp) |
-| 36 | pomp R code for the estimation of unknown parameters in a two-population SEIR model from data collected in Whitman County, Washington (R) | Build a two-population SEIR model using the pomp coding framework in R and estimate the unknown parameters in this model using the PMCMC algorithm. Parameter estimated: Transmission parameters (transmission within each population and transmission across the two-populations), testing probability, and overdispersion parameter.
([Learn more…](profiles.md#pomp-r-code-for-the-estimation-of-unknown-parameters-in-a-two-population-seir-model-from-data-collected-in-whitman-county-washington))
|
-| 37 | Post-acute care model (R) | A basic model to plan for the post-acute care needs following a hospital surge
([Learn more…](profiles.md#post-acute-care-model))
**GitHub:** [](https://github.com/mattrmaloney/covid-post-acute-care) |
-| 38 | quadkeyr (Python) | An R package designed to create raster images from QuadKey-identified data (Microsoft Bing Maps Tile System), aiming to simplify the analysis of Facebook mobility data.
([Learn more…](profiles.md#quadkeyr))
**GitHub:** [](https://github.com/Fernandez-Lab-WSU/quadkeyr) |
-| 39 | rbranding (R) | An R package that facilitates the creation of Shiny applications and quarto documents with support for site-specific branding and styling.
([Learn more…](profiles.md#rbranding))
**GitHub:** [](https://github.com/EpiForeSITE/branding-package) |
-| 40 | School outbreak simulator (Anylogic) | Agent-based simulation of person-to-person transmission at schools over data-based dynamic proximity contact networks. Scenarios(s) Modeled: Transmission modeled during school hours; can model interventions affecting the contact network and school attendance behavior.
([Learn more…](profiles.md#school-outbreak-simulator))
|
-| 41 | Serfling (JMP) | Classic Serfling-type regression model for seasonal diseases. Can be used to estimate both excess risk (based on breaching a threshold), or estimate the peak week and other parameters of a yearly epidemic curve.
([Learn more…](profiles.md#serfling))
|
-| 42 | Statistical Alerts (time series) (R) | We have supported an Operations system for processing time series for “aberrations” (aka, “alerts”, “potential outbreaks”) for 8+ years in VA BASIC. During this time, we’ve integrated several among the suite of algorithms available in the R package titled “surveillance”. This includes several classes of numerical methods, of which some are window-based, control chart-based or trained linear models. A brief presentation on this is attached here.
([Learn more…](profiles.md#statistical-alerts-time-series))
|
-| 43 | Transmission estimation for outbreak clusters (R) | Provides estimates for individual-level transmission distribution (mean and variance) based on data from prior isolated outbreak clusters. Useful for quantifying the risk of superspreading events and the risk that future outbreaks will exceed a given threshold.Parameter estimated: Basic reproduction number; dispersion parameter quantifying variance in transmission; extensions estimate changes in reproduction number by generation, e.g. post-control reproduction number. Estimated via maximum likelihood using final size distribution equations for branching process models.
([Learn more…](profiles.md#transmission-estimation-for-outbreak-clusters))
|
-| 44 | Multigroup Vaccine Model (R) | A tool for exploring the effects of varying rates of vaccination among disparate socio-economic groups
([Learn more…](profiles.md#multigroup-vaccine-model))
**GitHub:** [](https://github.com/EpiForeSITE/vaccine-equity-model) |
-| 45 | Vaccine Hesitancy Model (Matlab, R, and Mathematica.) | An ODE (ordinary differential equation)-based SVEIR model with 3 compartments for symptoms (mild, moderate, severe) that can quantify the tradeoffs between vaccine efficacy and vaccine hesitancy on reducing the disease burden. Scenarios(s) Modeled: R0, cumulative infections, and deaths due to varying values of transmission rate, vaccine coverage rate, vaccine efficacy, and vaccine hesitancy. The vaccine efficacy required to compensate for different levels of vaccine hesitancy.
([Learn more…](profiles.md#vaccine-hesitancy-model))
|
+| 14 | EPICC: Epidemiological Cost Calculator (Python) | EPICC is a Streamlit web application for estimating and comparing the economic cost of outbreak scenarios. Users pick a disease (measles and tuberculosis presets are included), adjust the pre-populated cost and outbreak parameters, and compare multiple scenarios side by side. Parameter sets can be authored and exchanged as YAML or XLSX files, are validated against a generated Pydantic model, and results can be exported as a shareable report for public health officials and other decision makers.
([Learn more…](profiles.md#epicc-epidemiological-cost-calculator))
**GitHub:** [](https://github.com/EpiForeSITE/epicc) |
+| 15 | epitraxr: Manipulate Epitrax Data And Generate Reports (R) | R package for manipulating Epitrax data and generating reports. This tool is designed to simplify the process of working with Epitrax data, making it easier for public health professionals to analyze and report on disease surveillance data. It generates internal and public reports in CSV, Excel, or PDF formats.
([Learn more…](profiles.md#epitraxr-manipulate-epitrax-data-and-generate-reports))
**GitHub:** [](https://github.com/EpiForeSITE/epitraxr) |
+| 16 | epiworld: Fast Agent-Based Epi Models (R, C++, Python, Webessembly) | A flexible framework for Agent-Based Models (ABM), the ‘epiworldR’ package provides methods for prototyping disease outbreaks and transmission models using a ‘C++’ backend, making it very fast. It supports multiple epidemiological models, including the Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), and others, involving arbitrary mitigation policies and multiple-disease models. Users can specify infectiousness/susceptibility rates as a function of agents’ features, providing great complexity for the model dynamics. Furthermore, ‘epiworldR’ is ideal for simulation studies featuring large populations.
([Learn more…](profiles.md#epiworld-fast-agent-based-epi-models))
**GitHub:** [](https://github.com/UofUEpiBio/epiworld) |
+| 17 | epiworld-forecasts: Automatic Disease Forecasting with epiworldR (R) | epiworld-forecasts uses epiworldR, GitHub Actions, and Docker to generate disease forecasts that update automatically. While we provide an example forecast of COVID-19 case counts in Utah, this tool is an open-source, template repository that can easily be adapted to generate forecasts for different diseases.
([Learn more…](profiles.md#epiworld-forecasts-automatic-disease-forecasting-with-epiworldr))
**GitHub:** [](https://github.com/EpiForeSITE/epiworld-forecasts) |
+| 18 | epiworldpy: A python wrapper for epiworld (Python) | A flexible framework for Agent-Based Models (ABM), the ‘epiworldR’ package provides methods for prototyping disease outbreaks and transmission models using a ‘C++’ backend, making it very fast. It supports multiple epidemiological models, including the Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), and others, involving arbitrary mitigation policies and multiple-disease models. Users can specify infectiousness/susceptibility rates as a function of agents’ features, providing great complexity for the model dynamics. Furthermore, ‘epiworldR’ is ideal for simulation studies featuring large populations.
([Learn more…](profiles.md#epiworldpy-a-python-wrapper-for-epiworld))
**GitHub:** [](https://github.com/UofUEpiBio/epiworldpy) |
+| 19 | epiworldRcalibrate: Fast and Effortless Calibration of Agent-Based Models using Machine Learning (R) | Provides tools and pre-trained Machine Learning \[ML\] models for calibration of Agent-Based Models \[ABMs\] built with the R package ‘epiworldR’. Implements methods described in Najafzadehkhoei, Vega Yon, Modenesi, and Meyer (2025) . Users can automatically calibrate ABMs in seconds with pre-trained ML models, effectively focusing on simulation rather than calibration. Bridges a gap by allowing public health practitioners to run their own ABMs without the advanced technical expertise often required by calibration.
([Learn more…](profiles.md#epiworldrcalibrate-fast-and-effortless-calibration-of-agent-based-models-using-machine-learning))
**GitHub:** [](https://github.com/sima-njf/epiworldRcalibrate) |
+| 20 | GeoCovid (R) | Shiny App for visualizing mobility data and COVID-19 cases in Buenos Aires province during March to December 2020.
([Learn more…](profiles.md#geocovid))
**GitHub:** [](https://github.com/Fernandez-Lab-WSU/geocovid_app) |
+| 21 | H1N1 Pandemic Data Estimation (TBD) | Describes an SIR model parameter estimation with an improved fit using least squares estimation over maximum likelihood estimation. Parameter estimated: Transmission rate, recovery rate, R0, number of initial infectives
([Learn more…](profiles.md#h1n1-pandemic-data-estimation))
|
+| 22 | Healthcare facility network outbreak simulator (Anylogic) | Provides flexible framework for agent-based simulation of outbreaks among in-patients in a generic-but-realistic network of short/long-stay hospitals and nursing homes, as well as interventions to mitigate transmission and inter-facility spread. Scenarios(s) Modeled: Initial invasion of new pathogen / strain and/or endemic pathogens. Intervention scenarios for patient-targeted efforts including surveillance and isolation (contact precautions), vaccination, and anti-microbial drug treatment.
([Learn more…](profiles.md#healthcare-facility-network-outbreak-simulator))
|
+| 23 | Healthcare transmission epidemiology estimation at equilibrium (R) | Estimate the extent of patient-to-patient transmission and other quantities using admission prevalence and cross-sectional point-prevalence data for carriage of organisms among healthcare facility in-patients. Parameter estimated: Patient-to-patient transmission rate, facility reproduction number, rate of progression to infection, intervention effects if applicable. Estimates derived via solving differential equations at equilibrium and facility reproduction number equations.
([Learn more…](profiles.md#healthcare-transmission-epidemiology-estimation-at-equilibrium))
|
+| 24 | Herpes Vaccine Model (Matlab) | An ODE-based 6-compartment SI model with asymptomatic carriers and vaccinated classes to forecast the number of infections prevented with imperfect vaccination and infections prevented per vaccine administered. Parameter estimated: Highly correlated parameters determined using LHS PRCC. Scenarios(s) Modeled: Prophylactic (pre-exposure) vaccines, Therapeutic (post-exposure) vaccines, Parameter(s) Estimated: Highly correlated parameters determined using LHS PRCC
([Learn more…](profiles.md#herpes-vaccine-model))
|
+| 25 | HIV End Stage Kidney Disease Epidemic Model (Coded in Matlab, Berkeley Madonna, or Excel.) | An ODE-based model to predict future disease prevalence given the impact of drug therapy levels and its mechanism of action (i.e., stopping progression to disease or reducing deaths). Parameter estimated: Growth rate, death rate, drug efficacy to block disease progression. Scenarios(s) Modeled: Rebound in prevalence due to insufficient therapy (e.g., like in Paxlovid rebound).
([Learn more…](profiles.md#hiv-end-stage-kidney-disease-epidemic-model))
|
+| 26 | Household epidemiology estimation from antibody data (R) | Simultaneously estimate household importation risk, household secondary attack rate, and associated variability / heterogeneities using point-prevalence data for antibody positivity among household members. Parameter estimated: Household importation probability, household secondary attack rate, sensitivity / specificity of data for indicating prior infection, variability (dispersion) in transmissibility, and heterogeneities in those quantities over age and/or other identifiable characteristics of individuals and households. Estimates derived via maximum likelihood for final household outbreak size equations.
([Learn more…](profiles.md#household-epidemiology-estimation-from-antibody-data))
|
+| 27 | Household transmission simulator (R) | Simulate household importation and within-household transmission across a population of households, and intervention effects, e.g. vaccination. Scenarios(s) Modeled: Household importation and transmission with variability in transmissibility and heterogeneity across age groups and vaccination status.
([Learn more…](profiles.md#household-transmission-simulator))
|
+| 28 | Impact of school opening model on SARS-CoV-2 community incidence and mortality (Stata) | The goal of this statistical analysis was to compare SARS-CoV-2 community incidence and mortality rates across schools that opened in in-person, remote, or hybrid mode. Measure(s) of Economic Impact: Infections and mortality
([Learn more…](profiles.md#impact-of-school-opening-model-on-sars-cov-2-community-incidence-and-mortality))
|
+| 29 | linkeR: Effortless Linked Views for Shiny Applications (R) | linkeR makes it effortless to create linked views in Shiny applications. When users interact with one component (like clicking a map marker), all related components (tables, charts, other maps) automatically update to show corresponding information.
([Learn more…](profiles.md#linker-effortless-linked-views-for-shiny-applications))
**GitHub:** [](https://github.com/EpiForeSITE/linkeR/) |
+| 30 | Long-term acute care hospital (LTACH) intervention model (R) | Provides analytic framework for investigating patient-focused interventions to prevent transmission in high-risk healthcare facilities and their direct and population-level health impacts and threshold effects. Scenarios(s) Modeled: Intervention scenarios for surveillance and isolation (contact precautions), decolonization drugs, infection treatment, horizontal transmission reduction, and length of stay reduction.
([Learn more…](profiles.md#long-term-acute-care-hospital-ltach-intervention-model))
|
+| 31 | measles: Measles Epidemiological Models (R, C++) | A specialized collection of measles epidemiological models built on the ‘epiworldR’ framework. This package is a spinoff from ‘epiworldR’ focusing specifically on measles transmission dynamics. It includes models for school settings with quarantine and isolation policies, mixing models with population groups, and risk-based quarantine strategies. The models use Agent-Based Models (ABM) with a fast ‘C++’ backend from the ‘epiworld’ library. Ideal for studying measles outbreaks, vaccination strategies, and intervention policies.
([Learn more…](profiles.md#measles-measles-epidemiological-models))
**GitHub:** [](https://github.com/UofUEpiBio/measles) |
+| 32 | Monolix (Monolix can be used either via a graphical user interface (GUI) or a command-line interface (CLI) for powerful scripting. R package available) | Parameter estimation in non-linear mixed effect models. Parameter estimated: Any.
([Learn more…](profiles.md#monolix))
|
+| 33 | Multigroup Vaccine Model (R) | A tool for exploring the effects of varying rates of vaccination among disparate socio-economic groups
([Learn more…](profiles.md#multigroup-vaccine-model))
**GitHub:** [](https://github.com/EpiForeSITE/multigroup-vaccine) |
+| 34 | Multitask Model to Forecast Patient’s Next Unit and Remaining Length of Stay (Python) | Length of Stay prediction and unit transfer prediction tool. Scenarios(s) Modeled: In this multi-task learning model, we train the model to predict:Task-1: patient’s unit label in next time step. Task-2: patient’s remaining length of stay.The model inputs get updated on a daily basis and generates prediction accordingly.
([Learn more…](profiles.md#multitask-model-to-forecast-patient-s-next-unit-and-remaining-length-of-stay))
**GitHub:** [](https://github.com/madhobi/multitask_unit_and_days) |
+| 35 | Net financial impact of halting elective admissions (Stata) | The goal of this model was to estimate the net financial impact to the hospital of halting elective admissions due to a COVID-19 surge. Measure(s) of Economic Impact: Hospital profit
([Learn more…](profiles.md#net-financial-impact-of-halting-elective-admissions))
|
+| 36 | Nowcasting (TBD) | Given the time lag between laboratory testing for disease and eventual reporting, we’ve developed a model which consumes data from both community and VA to predict “now” how many positive tests for a disease (COVID-19 in this context) will eventually be reported as positive. A VA HSR&D abstract is available.
([Learn more…](profiles.md#nowcasting))
|
+| 37 | PhenoMapper: an interactive toolbox for the visual exploration of phenomics data (PhenoMapper extension) | TDA tool that can possibly help us to view some trajectory data. Scenarios(s) Modeled: We demonstrate the utility of this new tool on real-world plant (e.g., maize) phenomics datasets.
([Learn more…](profiles.md#phenomapper-an-interactive-toolbox-for-the-visual-exploration-of-phenomics-data))
**GitHub:** [](https://github.com/tdavislab/PhenoMapper) |
+| 38 | POMP (Aaron King’s tool, U. of Michigan) (R) | Analysis of time series data based on stochastic dynamical systems models
([Learn more…](profiles.md#pomp-aaron-king-s-tool-u-of-michigan))
**GitHub:** [](https://github.com/kingaa/pomp) |
+| 39 | pomp R code for the estimation of unknown parameters in a two-population SEIR model from data collected in Whitman County, Washington (R) | Build a two-population SEIR model using the pomp coding framework in R and estimate the unknown parameters in this model using the PMCMC algorithm. Parameter estimated: Transmission parameters (transmission within each population and transmission across the two-populations), testing probability, and overdispersion parameter.
([Learn more…](profiles.md#pomp-r-code-for-the-estimation-of-unknown-parameters-in-a-two-population-seir-model-from-data-collected-in-whitman-county-washington))
|
+| 40 | Post-acute care model (R) | A basic model to plan for the post-acute care needs following a hospital surge
([Learn more…](profiles.md#post-acute-care-model))
**GitHub:** [](https://github.com/mattrmaloney/covid-post-acute-care) |
+| 41 | quadkeyr (Python) | An R package designed to create raster images from QuadKey-identified data (Microsoft Bing Maps Tile System), aiming to simplify the analysis of Facebook mobility data.
([Learn more…](profiles.md#quadkeyr))
**GitHub:** [](https://github.com/Fernandez-Lab-WSU/quadkeyr) |
+| 42 | rbranding (R) | An R package that facilitates the creation of Shiny applications and quarto documents with support for site-specific branding and styling.
([Learn more…](profiles.md#rbranding))
**GitHub:** [](https://github.com/EpiForeSITE/rbranding) |
+| 43 | School outbreak simulator (Anylogic) | Agent-based simulation of person-to-person transmission at schools over data-based dynamic proximity contact networks. Scenarios(s) Modeled: Transmission modeled during school hours; can model interventions affecting the contact network and school attendance behavior.
([Learn more…](profiles.md#school-outbreak-simulator))
|
+| 44 | Serfling (JMP) | Classic Serfling-type regression model for seasonal diseases. Can be used to estimate both excess risk (based on breaching a threshold), or estimate the peak week and other parameters of a yearly epidemic curve.
([Learn more…](profiles.md#serfling))
|
+| 45 | Statistical Alerts (time series) (R) | We have supported an Operations system for processing time series for “aberrations” (aka, “alerts”, “potential outbreaks”) for 8+ years in VA BASIC. During this time, we’ve integrated several among the suite of algorithms available in the R package titled “surveillance”. This includes several classes of numerical methods, of which some are window-based, control chart-based or trained linear models. A brief presentation on this is attached here.
([Learn more…](profiles.md#statistical-alerts-time-series))
|
+| 46 | Transmission estimation for outbreak clusters (R) | Provides estimates for individual-level transmission distribution (mean and variance) based on data from prior isolated outbreak clusters. Useful for quantifying the risk of superspreading events and the risk that future outbreaks will exceed a given threshold.Parameter estimated: Basic reproduction number; dispersion parameter quantifying variance in transmission; extensions estimate changes in reproduction number by generation, e.g. post-control reproduction number. Estimated via maximum likelihood using final size distribution equations for branching process models.
([Learn more…](profiles.md#transmission-estimation-for-outbreak-clusters))
|
+| 47 | Multigroup Vaccine Model (R) | A tool for exploring the effects of varying rates of vaccination among disparate socio-economic groups
([Learn more…](profiles.md#multigroup-vaccine-model))
**GitHub:** [](https://github.com/EpiForeSITE/vaccine-equity-model) |
+| 48 | Vaccine Hesitancy Model (Matlab, R, and Mathematica.) | An ODE (ordinary differential equation)-based SVEIR model with 3 compartments for symptoms (mild, moderate, severe) that can quantify the tradeoffs between vaccine efficacy and vaccine hesitancy on reducing the disease burden. Scenarios(s) Modeled: R0, cumulative infections, and deaths due to varying values of transmission rate, vaccine coverage rate, vaccine efficacy, and vaccine hesitancy. The vaccine efficacy required to compensate for different levels of vaccine hesitancy.
([Learn more…](profiles.md#vaccine-hesitancy-model))
|

diff --git a/README.qmd b/README.qmd
index f9eefda..3a1eded 100644
--- a/README.qmd
+++ b/README.qmd
@@ -18,7 +18,8 @@ existing_software <- list.files(
) |>
lapply(FUN = yaml.load_file, as.named.list = TRUE) |>
lapply(as.data.table) |>
- rbindlist()
+ # `fill` keeps optional fields (e.g. `cran_name`) from breaking the bind
+ rbindlist(fill = TRUE)
writexl::write_xlsx(x = existing_software, path = "data/software.xlsx")
diff --git a/README_files/figure-commonmark/wordcloud-1.png b/README_files/figure-commonmark/wordcloud-1.png
index 30c1c6c..897384c 100644
Binary files a/README_files/figure-commonmark/wordcloud-1.png and b/README_files/figure-commonmark/wordcloud-1.png differ
diff --git a/data/README.md b/data/README.md
index 4f9749d..f0de919 100644
--- a/data/README.md
+++ b/data/README.md
@@ -22,6 +22,18 @@ docs_link:
github_link:
```
+### Optional fields
+
+| Field | Description |
+|:------|:------------|
+| `cran_name` | Name of the package on CRAN. Only needed when it cannot be guessed from the repository or tool name (e.g. `epiworldR` for the `epiworld` repository). Set it to `no` to keep the project status dashboard from looking the project up on CRAN. |
+
+When `cran_name` is absent, [`../scripts/update_project_status.R`](../scripts/update_project_status.R)
+tries the repository name and the first word of `tool_name` against the CRAN index, and
+only accepts a match when the CRAN metadata links back to the same GitHub owner or
+repository. Matching projects get CRAN version and download badges next to their
+repository link in [`../project_status.md`](../project_status.md).
+
## Example Project YAML File
```yaml
tool_name: 'epiworld: Fast Agent-Based Epi Models'
diff --git a/data/epicc.yml b/data/epicc.yml
new file mode 100644
index 0000000..eec8421
--- /dev/null
+++ b/data/epicc.yml
@@ -0,0 +1,22 @@
+tool_name: 'EPICC: Epidemiological Cost Calculator'
+tool_description: EPICC is a Streamlit web application for estimating and comparing the
+ economic cost of outbreak scenarios. Users pick a disease (measles and tuberculosis
+ presets are included), adjust the pre-populated cost and outbreak parameters, and
+ compare multiple scenarios side by side. Parameter sets can be authored and exchanged
+ as YAML or XLSX files, are validated against a generated Pydantic model, and results
+ can be exported as a shareable report for public health officials and other
+ decision makers.
+contact_name: Edward Wang, George G. Vega Yon
+contact_email: george.vegayon@utah.edu
+is_maintained: 'Yes'
+relevant_diseases: Measles, Tuberculosis
+maturity: 'Alpha/Beta phase: ready for initial user testing but requires additional
+ development and testing'
+license: .na.character
+languages: Python
+audience_type: Public Health Professionals
+required_expertise: Beginner
+tool_type: Decision Support tool
+input_type: Disease, outbreak, and cost parameters (YAML or XLSX)
+docs_link: https://epiforesite.github.io/epicc/, https://epiworldpythonapp.streamlit.app/
+github_link: https://github.com/EpiForeSITE/epicc
diff --git a/data/epiworld_fast_agent_based_epi_models.yml b/data/epiworld_fast_agent_based_epi_models.yml
index c8cb3d4..9f9695f 100644
--- a/data/epiworld_fast_agent_based_epi_models.yml
+++ b/data/epiworld_fast_agent_based_epi_models.yml
@@ -21,4 +21,5 @@ tool_type: Epidemic Model - Scenario Modeling
input_type: Parameter inputs for simulating the model
docs_link: https://github.com/UofUEpiBio/epiworld, https://github.com/UofUEpiBio/epiworldR/,
https://github.com/UofUEpiBio/epiworldpy, https://github.com/UofUEpiBio/epiworldRShiny
-github_link: https://github.com/UofUEpiBio/epiworld
\ No newline at end of file
+github_link: https://github.com/UofUEpiBio/epiworld
+cran_name: epiworldR
diff --git a/data/epiworldrcalibrate.yml b/data/epiworldrcalibrate.yml
new file mode 100644
index 0000000..5ff78b4
--- /dev/null
+++ b/data/epiworldrcalibrate.yml
@@ -0,0 +1,23 @@
+tool_name: 'epiworldRcalibrate: Fast and Effortless Calibration of Agent-Based Models
+ using Machine Learning'
+tool_description: Provides tools and pre-trained Machine Learning [ML] models for
+ calibration of Agent-Based Models [ABMs] built with the R package 'epiworldR'.
+ Implements methods described in Najafzadehkhoei, Vega Yon, Modenesi, and Meyer
+ (2025) . Users can automatically calibrate ABMs in
+ seconds with pre-trained ML models, effectively focusing on simulation rather than
+ calibration. Bridges a gap by allowing public health practitioners to run their own
+ ABMs without the advanced technical expertise often required by calibration.
+contact_name: Sima Najafzadehkhoei
+contact_email: sima.njf@utah.edu
+is_maintained: 'Yes'
+relevant_diseases: .na.character
+maturity: Published
+license: MIT
+languages: R
+audience_type: Modelers
+required_expertise: TBD
+tool_type: Parameter estimation
+input_type: Observed incidence data and model parameters to calibrate
+docs_link: https://sima-njf.github.io/epiworldRcalibrate/, https://github.com/sima-njf/epiworldRcalibrate
+github_link: https://github.com/sima-njf/epiworldRcalibrate
+cran_name: epiworldRcalibrate
diff --git a/data/measles.yml b/data/measles.yml
new file mode 100644
index 0000000..1cbb4e2
--- /dev/null
+++ b/data/measles.yml
@@ -0,0 +1,22 @@
+tool_name: 'measles: Measles Epidemiological Models'
+tool_description: A specialized collection of measles epidemiological models built on
+ the 'epiworldR' framework. This package is a spinoff from 'epiworldR' focusing
+ specifically on measles transmission dynamics. It includes models for school settings
+ with quarantine and isolation policies, mixing models with population groups, and
+ risk-based quarantine strategies. The models use Agent-Based Models (ABM) with a fast
+ 'C++' backend from the 'epiworld' library. Ideal for studying measles outbreaks,
+ vaccination strategies, and intervention policies.
+contact_name: George G. Vega Yon
+contact_email: george.vegayon@utah.edu
+is_maintained: 'Yes'
+relevant_diseases: Measles
+maturity: Published
+license: MIT
+languages: R, C++
+audience_type: Modelers
+required_expertise: TBD
+tool_type: Epidemic Model - Scenario Modeling
+input_type: Parameter inputs for simulating the model
+docs_link: https://uofuepibio.github.io/measles/, https://github.com/UofUEpiBio/measles
+github_link: https://github.com/UofUEpiBio/measles
+cran_name: measles
diff --git a/data/rbranding.yml b/data/rbranding.yml
index d464b4a..4946c61 100644
--- a/data/rbranding.yml
+++ b/data/rbranding.yml
@@ -11,5 +11,6 @@ audience_type: Public health professionals, dashboard and report builders
required_expertise: TBD
tool_type: Developer Tool
input_type: .na.character
-docs_link: https://epiforesite.github.io/branding-package/
-github_link: https://github.com/EpiForeSITE/branding-package
\ No newline at end of file
+docs_link: https://epiforesite.github.io/rbranding/
+github_link: https://github.com/EpiForeSITE/rbranding
+cran_name: rbranding
diff --git a/data/software.xlsx b/data/software.xlsx
index 5cfcb1f..85264f4 100644
Binary files a/data/software.xlsx and b/data/software.xlsx differ
diff --git a/profiles.md b/profiles.md
index 4c04751..1664e5a 100644
--- a/profiles.md
+++ b/profiles.md
@@ -1,6 +1,6 @@
# Profiles
-This file is automatically generated and should not be edited manually. Last updated on 2025-08-14.
+This file is automatically generated and should not be edited manually. Last updated on 2026-08-14.
## Airborne release of infectious pathogens simulator
@@ -114,6 +114,14 @@ Contact: Damon Toth (email: Damon.Toth@hsc.utah.edu)
Links:
1-Toth D, Gundlapalli A, Schell W, Bulmahn K, Walton T, Woods C, Coghill C, Gallegos F, Samore M, Adler F (2013). Quantitative models of the dose-response and time course of inhalational anthrax in humans. PLoS Pathog, 9(8), e1003555. https://doi.org/10.1371/journal.ppat.1003555.
2-Bulmahn K, Canella M, Coghill C, Gallegos F, Gundlapalli A, Schell W, Toth D, Walton T, Woods C (2012). Final Supplementary Risk Assessment for the Boston University National Emerging Infectious Diseases Laboratories, National Institutes of Health. https://www.bu.edu/neidl/files/2013/01/SFEIR-Volume-III.pdf (Chapter 8; Appendix J).
+## EPICC: Epidemiological Cost Calculator
+
+EPICC is a Streamlit web application for estimating and comparing the economic cost of outbreak scenarios. Users pick a disease (measles and tuberculosis presets are included), adjust the pre-populated cost and outbreak parameters, and compare multiple scenarios side by side. Parameter sets can be authored and exchanged as YAML or XLSX files, are validated against a generated Pydantic model, and results can be exported as a shareable report for public health officials and other decision makers.
+
+Contact: Edward Wang, George G. Vega Yon (email: george.vegayon@utah.edu)
+
+Links:
https://epiforesite.github.io/epicc/, https://epiworldpythonapp.streamlit.app/
+
## epitraxr: Manipulate Epitrax Data And Generate Reports
R package for manipulating Epitrax data and generating reports. This tool is designed to simplify the process of working with Epitrax data, making it easier for public health professionals to analyze and report on disease surveillance data. It generates internal and public reports in CSV, Excel, or PDF formats.
@@ -146,6 +154,14 @@ Contact: George G. Vega Yon, Milo Banks (email: george.vegayon@utah.edu)
Links:
https://github.com/UofUEpiBio/epiworldpy
+## epiworldRcalibrate: Fast and Effortless Calibration of Agent-Based Models using Machine Learning
+
+Provides tools and pre-trained Machine Learning [ML] models for calibration of Agent-Based Models [ABMs] built with the R package 'epiworldR'. Implements methods described in Najafzadehkhoei, Vega Yon, Modenesi, and Meyer (2025) . Users can automatically calibrate ABMs in seconds with pre-trained ML models, effectively focusing on simulation rather than calibration. Bridges a gap by allowing public health practitioners to run their own ABMs without the advanced technical expertise often required by calibration.
+
+Contact: Sima Najafzadehkhoei (email: sima.njf@utah.edu)
+
+Links:
https://sima-njf.github.io/epiworldRcalibrate/, https://github.com/sima-njf/epiworldRcalibrate
+
## GeoCovid
Shiny App for visualizing mobility data and COVID-19 cases in Buenos Aires province during March to December 2020.
@@ -236,6 +252,14 @@ Contact: Damon Toth (email: Damon.Toth@hsc.utah.edu)
Links:
1-Toth D, Khader K, Beams A, Samore M (2019). Model-based Assessment of the Effect of Contact Precautions Applied to Surveillance-detected Carriers of Carbapenemase-producing Enterobacteriaceae in Long-term Acute Care Hospitals, Clinical Infectious Diseases 69(Supplement_3), S206–S213. https://doi.org/10.1093/cid/ciz557. 2-Toth D, Samore M, Nelson R (2021), Economic Evaluations of New Antibiotics: The High Potential Value of Reducing Healthcare Transmission Through Decolonization, Clinical Infectious Diseases 72(Supplement_1), S34–S41. https://doi.org/10.1093/cid/ciaa1590.
+## measles: Measles Epidemiological Models
+
+A specialized collection of measles epidemiological models built on the 'epiworldR' framework. This package is a spinoff from 'epiworldR' focusing specifically on measles transmission dynamics. It includes models for school settings with quarantine and isolation policies, mixing models with population groups, and risk-based quarantine strategies. The models use Agent-Based Models (ABM) with a fast 'C++' backend from the 'epiworld' library. Ideal for studying measles outbreaks, vaccination strategies, and intervention policies.
+
+Contact: George G. Vega Yon (email: george.vegayon@utah.edu)
+
+Links:
https://uofuepibio.github.io/measles/, https://github.com/UofUEpiBio/measles
+
## Monolix
Parameter estimation in non-linear mixed effect models. Parameter estimated: Any.
@@ -322,7 +346,7 @@ An R package that facilitates the creation of Shiny applications and quarto docu
Contact: Willy Ray (email: william.ray@hsc.utah.edu)
-Links:
https://epiforesite.github.io/branding-package/
+Links:
https://epiforesite.github.io/rbranding/
## School outbreak simulator
diff --git a/project_status.md b/project_status.md
index cba89f2..4cb9717 100644
--- a/project_status.md
+++ b/project_status.md
@@ -1,32 +1,45 @@
# Project Status Dashboard
-Last updated: 2026-08-14 06:29:15.53613 (UTC)
+Last updated: 2026-08-14 17:55:47.378192 (UTC)
-This dashboard tracks 21 EpiForeSITE projects with GitHub repositories.
+This dashboard tracks 24 EpiForeSITE projects with GitHub repositories.
+
+| | |
+|---|---|
+| 🟢 Active (commit in the last 90 days) | 8 |
+| 🟡 Slow (commit in the last year) | 5 |
+| ⚪ Dormant (no commit in over a year) | 11 |
+| 📦 Published on CRAN | 8 |
+| Open issues / open PRs | 180 / 29 |
+
+Projects are sorted by most recent commit.
| Project | Contributors | Issues, PRs, and Last Commit | Commits | Repository |
-|---------|-------------|--------------------------|---------|------------|
-| [Attention-Based Models for Snow-Water Equivalent Prediction](https://github.com/Krishuthapa/SWE-Attention) |
| [](https://github.com/Krishuthapa/SWE-Attention/issues)
[](https://github.com/Krishuthapa/SWE-Attention/pulls)
2024-12-12 ([`e95fe16`](https://github.com/Krishuthapa/SWE-Attention/commits)) | 0 | [Krishuthapa/SWE-Attention](https://github.com/Krishuthapa/SWE-Attention) | |
-| [Bayesian Transmission Model](https://github.com/EpiForeSITE/bayesian-transmission) | 


| [](https://github.com/EpiForeSITE/bayesian-transmission/issues)
[](https://github.com/EpiForeSITE/bayesian-transmission/pulls)
2026-01-06 ([`b30d1e0`](https://github.com/EpiForeSITE/bayesian-transmission/commits)) | 131 | [EpiForeSITE/bayesian-transmission](https://github.com/EpiForeSITE/bayesian-transmission) | |
-| [Branching process outbreak simulator](https://github.com/EpiForeSITE/branching_process/) | 


| [](https://github.com/EpiForeSITE/branching_process//issues)
[](https://github.com/EpiForeSITE/branching_process//pulls)
2025-05-09 ([`8e9bac5`](https://github.com/EpiForeSITE/branching_process//commits)) | 0 | [EpiForeSITE/branching_process](https://github.com/EpiForeSITE/branching_process/) | |
-| [COVID-19 Jail Model](https://github.com/epimodels/COVID19-Jails) |
| [](https://github.com/epimodels/COVID19-Jails/issues)
[](https://github.com/epimodels/COVID19-Jails/pulls)
2020-04-30 ([`561491b`](https://github.com/epimodels/COVID19-Jails/commits)) | 0 | [epimodels/COVID19-Jails](https://github.com/epimodels/COVID19-Jails) | |
-| [COVID-19 NCAA Football](https://github.com/epimodels/inperson_sports) |
| [](https://github.com/epimodels/inperson_sports/issues)
[](https://github.com/epimodels/inperson_sports/pulls)
2020-09-28 ([`9681971`](https://github.com/epimodels/inperson_sports/commits)) | 0 | [epimodels/inperson_sports](https://github.com/epimodels/inperson_sports) | |
-| [Covid Scenario model](https://github.com/HopkinsIDD/COVIDScenarioPipeline) | 



+5 more | [](https://github.com/HopkinsIDD/COVIDScenarioPipeline/issues)
[](https://github.com/HopkinsIDD/COVIDScenarioPipeline/pulls)
2023-02-21 ([`0c6084b`](https://github.com/HopkinsIDD/COVIDScenarioPipeline/commits)) | 0 | [HopkinsIDD/COVIDScenarioPipeline](https://github.com/HopkinsIDD/COVIDScenarioPipeline) | |
-| [CU Metapopulation](https://github.com/epimodels/Metapopulation_MRSA) | 
| [](https://github.com/epimodels/Metapopulation_MRSA/issues)
[](https://github.com/epimodels/Metapopulation_MRSA/pulls)
2022-07-14 ([`35bf356`](https://github.com/epimodels/Metapopulation_MRSA/commits)) | 0 | [epimodels/Metapopulation_MRSA](https://github.com/epimodels/Metapopulation_MRSA) | |
-| [epitraxr: Manipulate Epitrax Data And Generate Reports](https://github.com/EpiForeSITE/epitraxr) | 

| [](https://github.com/EpiForeSITE/epitraxr/issues)
[](https://github.com/EpiForeSITE/epitraxr/pulls)
2025-11-07 ([`3c5eca7`](https://github.com/EpiForeSITE/epitraxr/commits)) | 35 | [EpiForeSITE/epitraxr](https://github.com/EpiForeSITE/epitraxr) | |
-| [epiworld: Fast Agent-Based Epi Models](https://github.com/UofUEpiBio/epiworld) | 



| [](https://github.com/UofUEpiBio/epiworld/issues)
[](https://github.com/UofUEpiBio/epiworld/pulls)
2026-08-07 ([`9a9ca64`](https://github.com/UofUEpiBio/epiworld/commits)) | 0 | [UofUEpiBio/epiworld](https://github.com/UofUEpiBio/epiworld) | |
-| [epiworld-forecasts: Automatic Disease Forecasting with epiworldR](https://github.com/EpiForeSITE/epiworld-forecasts) | 

| [](https://github.com/EpiForeSITE/epiworld-forecasts/issues)
[](https://github.com/EpiForeSITE/epiworld-forecasts/pulls)
2025-12-03 ([`3dfca94`](https://github.com/EpiForeSITE/epiworld-forecasts/commits)) | 1 | [EpiForeSITE/epiworld-forecasts](https://github.com/EpiForeSITE/epiworld-forecasts) | |
-| [epiworldpy: A python wrapper for epiworld](https://github.com/UofUEpiBio/epiworldpy) |
| [](https://github.com/UofUEpiBio/epiworldpy/issues)
[](https://github.com/UofUEpiBio/epiworldpy/pulls)
2026-07-10 ([`dd0931f`](https://github.com/UofUEpiBio/epiworldpy/commits)) | 0 | [UofUEpiBio/epiworldpy](https://github.com/UofUEpiBio/epiworldpy) | |
-| [GeoCovid](https://github.com/Fernandez-Lab-WSU/geocovid_app) | No data | [](https://github.com/Fernandez-Lab-WSU/geocovid_app/issues)
[](https://github.com/Fernandez-Lab-WSU/geocovid_app/pulls)
No recent commits | 0 | [Fernandez-Lab-WSU/geocovid_app](https://github.com/Fernandez-Lab-WSU/geocovid_app) | |
-| [linkeR: Effortless Linked Views for Shiny Applications](https://github.com/EpiForeSITE/linkeR/) | 
| [](https://github.com/EpiForeSITE/linkeR//issues)
[](https://github.com/EpiForeSITE/linkeR//pulls)
2026-03-03 ([`e445306`](https://github.com/EpiForeSITE/linkeR//commits)) | 59 | [EpiForeSITE/linkeR](https://github.com/EpiForeSITE/linkeR/) | |
-| [Multigroup Vaccine Model](https://github.com/EpiForeSITE/multigroup-vaccine) | 



+1 more | [](https://github.com/EpiForeSITE/multigroup-vaccine/issues)
[](https://github.com/EpiForeSITE/multigroup-vaccine/pulls)
2026-08-07 ([`fd339c9`](https://github.com/EpiForeSITE/multigroup-vaccine/commits)) | 0 | [EpiForeSITE/multigroup-vaccine](https://github.com/EpiForeSITE/multigroup-vaccine) | |
-| [Multitask Model to Forecast Patient's Next Unit and Remaining Length of Stay](https://github.com/madhobi/multitask_unit_and_days) |
| [](https://github.com/madhobi/multitask_unit_and_days/issues)
[](https://github.com/madhobi/multitask_unit_and_days/pulls)
2024-10-10 ([`c21c84e`](https://github.com/madhobi/multitask_unit_and_days/commits)) | 0 | [madhobi/multitask_unit_and_days](https://github.com/madhobi/multitask_unit_and_days) | |
-| [PhenoMapper: an interactive toolbox for the visual exploration of phenomics data](https://github.com/tdavislab/PhenoMapper) | 

| [](https://github.com/tdavislab/PhenoMapper/issues)
[](https://github.com/tdavislab/PhenoMapper/pulls)
2024-04-22 ([`4cc2a66`](https://github.com/tdavislab/PhenoMapper/commits)) | 0 | [tdavislab/PhenoMapper](https://github.com/tdavislab/PhenoMapper) | |
-| [POMP (Aaron King’s tool, U. of Michigan)](https://github.com/kingaa/pomp) | 



+4 more | [](https://github.com/kingaa/pomp/issues)
[](https://github.com/kingaa/pomp/pulls)
2026-07-24 ([`0eaf3c0`](https://github.com/kingaa/pomp/commits)) | 0 | [kingaa/pomp](https://github.com/kingaa/pomp) | |
-| [Post-acute care model](https://github.com/mattrmaloney/covid-post-acute-care) | No data | [](https://github.com/mattrmaloney/covid-post-acute-care/issues)
[](https://github.com/mattrmaloney/covid-post-acute-care/pulls)
2020-06-13 ([`b60c0a6`](https://github.com/mattrmaloney/covid-post-acute-care/commits)) | 0 | [mattrmaloney/covid-post-acute-care](https://github.com/mattrmaloney/covid-post-acute-care) | |
-| [quadkeyr](https://github.com/Fernandez-Lab-WSU/quadkeyr) | 


| [](https://github.com/Fernandez-Lab-WSU/quadkeyr/issues)
[](https://github.com/Fernandez-Lab-WSU/quadkeyr/pulls)
2025-03-24 ([`83d2c4b`](https://github.com/Fernandez-Lab-WSU/quadkeyr/commits)) | 0 | [Fernandez-Lab-WSU/quadkeyr](https://github.com/Fernandez-Lab-WSU/quadkeyr) | |
-| [rbranding](https://github.com/EpiForeSITE/branding-package) | 



+1 more | [](https://github.com/EpiForeSITE/branding-package/issues)
[](https://github.com/EpiForeSITE/branding-package/pulls)
2026-05-05 ([`e0c2afb`](https://github.com/EpiForeSITE/branding-package/commits)) | 87 | [EpiForeSITE/branding-package](https://github.com/EpiForeSITE/branding-package) | |
-| [Multigroup Vaccine Model](https://github.com/EpiForeSITE/vaccine-equity-model) | 



+1 more | [](https://github.com/EpiForeSITE/vaccine-equity-model/issues)
[](https://github.com/EpiForeSITE/vaccine-equity-model/pulls)
2026-08-07 ([`fd339c9`](https://github.com/EpiForeSITE/vaccine-equity-model/commits)) | 0 | [EpiForeSITE/vaccine-equity-model](https://github.com/EpiForeSITE/vaccine-equity-model) | |
+|---------|--------------|------------------------------|---------|------------|
+| 🟢 [EPICC: Epidemiological Cost Calculator](https://github.com/EpiForeSITE/epicc) | 



| [](https://github.com/EpiForeSITE/epicc/issues)
[](https://github.com/EpiForeSITE/epicc/pulls)
2026-08-12 ([`ecddc6c`](https://github.com/EpiForeSITE/epicc/commits)) | 88 | [EpiForeSITE/epicc](https://github.com/EpiForeSITE/epicc) |
+| 🟢 [epiworld: Fast Agent-Based Epi Models](https://github.com/UofUEpiBio/epiworld) | 



| [](https://github.com/UofUEpiBio/epiworld/issues)
[](https://github.com/UofUEpiBio/epiworld/pulls)
2026-08-07 ([`9a9ca64`](https://github.com/UofUEpiBio/epiworld/commits)) | 658 | [UofUEpiBio/epiworld](https://github.com/UofUEpiBio/epiworld)
[](https://cran.r-project.org/package=epiworldR) [](https://cran.r-project.org/package=epiworldR) [](https://cran.r-project.org/package=epiworldR) |
+| 🟢 [Multigroup Vaccine Model](https://github.com/EpiForeSITE/multigroup-vaccine) | 



+1 more | [](https://github.com/EpiForeSITE/multigroup-vaccine/issues)
[](https://github.com/EpiForeSITE/multigroup-vaccine/pulls)
2026-08-07 ([`fd339c9`](https://github.com/EpiForeSITE/multigroup-vaccine/commits)) | 187 | [EpiForeSITE/multigroup-vaccine](https://github.com/EpiForeSITE/multigroup-vaccine) |
+| 🟢 [Multigroup Vaccine Model](https://github.com/EpiForeSITE/vaccine-equity-model) | 



+1 more | [](https://github.com/EpiForeSITE/vaccine-equity-model/issues)
[](https://github.com/EpiForeSITE/vaccine-equity-model/pulls)
2026-08-07 ([`fd339c9`](https://github.com/EpiForeSITE/vaccine-equity-model/commits)) | 187 | [EpiForeSITE/vaccine-equity-model](https://github.com/EpiForeSITE/vaccine-equity-model) |
+| 🟢 [epiworldRcalibrate: Fast and Effortless Calibration of Agent-Based Models using Machine Learning](https://github.com/sima-njf/epiworldRcalibrate) | 


| [](https://github.com/sima-njf/epiworldRcalibrate/issues)
[](https://github.com/sima-njf/epiworldRcalibrate/pulls)
2026-08-06 ([`53ffcd1`](https://github.com/sima-njf/epiworldRcalibrate/commits)) | 136 | [sima-njf/epiworldRcalibrate](https://github.com/sima-njf/epiworldRcalibrate)
[](https://cran.r-project.org/package=epiworldRcalibrate) [](https://cran.r-project.org/package=epiworldRcalibrate) [](https://cran.r-project.org/package=epiworldRcalibrate) |
+| 🟢 [measles: Measles Epidemiological Models](https://github.com/UofUEpiBio/measles) | 



+1 more | [](https://github.com/UofUEpiBio/measles/issues)
[](https://github.com/UofUEpiBio/measles/pulls)
2026-08-06 ([`e8fa4be`](https://github.com/UofUEpiBio/measles/commits)) | 441 | [UofUEpiBio/measles](https://github.com/UofUEpiBio/measles)
[](https://cran.r-project.org/package=measles) [](https://cran.r-project.org/package=measles) [](https://cran.r-project.org/package=measles) |
+| 🟢 [POMP (Aaron King’s tool, U. of Michigan)](https://github.com/kingaa/pomp) | 



+4 more | [](https://github.com/kingaa/pomp/issues)
[](https://github.com/kingaa/pomp/pulls)
2026-07-24 ([`0eaf3c0`](https://github.com/kingaa/pomp/commits)) | 3107 | [kingaa/pomp](https://github.com/kingaa/pomp)
[](https://cran.r-project.org/package=pomp) [](https://cran.r-project.org/package=pomp) [](https://cran.r-project.org/package=pomp) |
+| 🟢 [epiworldpy: A python wrapper for epiworld](https://github.com/UofUEpiBio/epiworldpy) |
| [](https://github.com/UofUEpiBio/epiworldpy/issues)
[](https://github.com/UofUEpiBio/epiworldpy/pulls)
2026-07-10 ([`dd0931f`](https://github.com/UofUEpiBio/epiworldpy/commits)) | 59 | [UofUEpiBio/epiworldpy](https://github.com/UofUEpiBio/epiworldpy) |
+| 🟡 [rbranding](https://github.com/EpiForeSITE/rbranding) | 



+1 more | [](https://github.com/EpiForeSITE/rbranding/issues)
[](https://github.com/EpiForeSITE/rbranding/pulls)
2026-05-05 ([`e0c2afb`](https://github.com/EpiForeSITE/rbranding/commits)) | 164 | [EpiForeSITE/rbranding](https://github.com/EpiForeSITE/rbranding)
[](https://cran.r-project.org/package=rbranding) [](https://cran.r-project.org/package=rbranding) [](https://cran.r-project.org/package=rbranding) |
+| 🟡 [linkeR: Effortless Linked Views for Shiny Applications](https://github.com/EpiForeSITE/linkeR/) | 
| [](https://github.com/EpiForeSITE/linkeR//issues)
[](https://github.com/EpiForeSITE/linkeR//pulls)
2026-03-03 ([`e445306`](https://github.com/EpiForeSITE/linkeR//commits)) | 101 | [EpiForeSITE/linkeR](https://github.com/EpiForeSITE/linkeR/)
[](https://cran.r-project.org/package=linkeR) [](https://cran.r-project.org/package=linkeR) [](https://cran.r-project.org/package=linkeR) |
+| 🟡 [Bayesian Transmission Model](https://github.com/EpiForeSITE/bayesian-transmission) | 


| [](https://github.com/EpiForeSITE/bayesian-transmission/issues)
[](https://github.com/EpiForeSITE/bayesian-transmission/pulls)
2026-01-06 ([`b30d1e0`](https://github.com/EpiForeSITE/bayesian-transmission/commits)) | 182 | [EpiForeSITE/bayesian-transmission](https://github.com/EpiForeSITE/bayesian-transmission) |
+| 🟡 [epiworld-forecasts: Automatic Disease Forecasting with epiworldR](https://github.com/EpiForeSITE/epiworld-forecasts) | 

| [](https://github.com/EpiForeSITE/epiworld-forecasts/issues)
[](https://github.com/EpiForeSITE/epiworld-forecasts/pulls)
2025-12-03 ([`3dfca94`](https://github.com/EpiForeSITE/epiworld-forecasts/commits)) | 51 | [EpiForeSITE/epiworld-forecasts](https://github.com/EpiForeSITE/epiworld-forecasts) |
+| 🟡 [epitraxr: Manipulate Epitrax Data And Generate Reports](https://github.com/EpiForeSITE/epitraxr) | 

| [](https://github.com/EpiForeSITE/epitraxr/issues)
[](https://github.com/EpiForeSITE/epitraxr/pulls)
2025-11-07 ([`3c5eca7`](https://github.com/EpiForeSITE/epitraxr/commits)) | 173 | [EpiForeSITE/epitraxr](https://github.com/EpiForeSITE/epitraxr)
[](https://cran.r-project.org/package=epitraxr) [](https://cran.r-project.org/package=epitraxr) [](https://cran.r-project.org/package=epitraxr) |
+| ⚪ [Branching process outbreak simulator](https://github.com/EpiForeSITE/branching_process/) | 


| [](https://github.com/EpiForeSITE/branching_process//issues)
[](https://github.com/EpiForeSITE/branching_process//pulls)
2025-05-09 ([`8e9bac5`](https://github.com/EpiForeSITE/branching_process//commits)) | 140 | [EpiForeSITE/branching_process](https://github.com/EpiForeSITE/branching_process/) |
+| ⚪ [quadkeyr](https://github.com/Fernandez-Lab-WSU/quadkeyr) | 


| [](https://github.com/Fernandez-Lab-WSU/quadkeyr/issues)
[](https://github.com/Fernandez-Lab-WSU/quadkeyr/pulls)
2025-03-24 ([`83d2c4b`](https://github.com/Fernandez-Lab-WSU/quadkeyr/commits)) | 193 | [Fernandez-Lab-WSU/quadkeyr](https://github.com/Fernandez-Lab-WSU/quadkeyr)
[](https://cran.r-project.org/package=quadkeyr) [](https://cran.r-project.org/package=quadkeyr) [](https://cran.r-project.org/package=quadkeyr) |
+| ⚪ [Attention-Based Models for Snow-Water Equivalent Prediction](https://github.com/Krishuthapa/SWE-Attention) |
| [](https://github.com/Krishuthapa/SWE-Attention/issues)
[](https://github.com/Krishuthapa/SWE-Attention/pulls)
2024-12-12 ([`e95fe16`](https://github.com/Krishuthapa/SWE-Attention/commits)) | 17 | [Krishuthapa/SWE-Attention](https://github.com/Krishuthapa/SWE-Attention) |
+| ⚪ [Multitask Model to Forecast Patient's Next Unit and Remaining Length of Stay](https://github.com/madhobi/multitask_unit_and_days) |
| [](https://github.com/madhobi/multitask_unit_and_days/issues)
[](https://github.com/madhobi/multitask_unit_and_days/pulls)
2024-10-10 ([`c21c84e`](https://github.com/madhobi/multitask_unit_and_days/commits)) | 19 | [madhobi/multitask_unit_and_days](https://github.com/madhobi/multitask_unit_and_days) |
+| ⚪ [PhenoMapper: an interactive toolbox for the visual exploration of phenomics data](https://github.com/tdavislab/PhenoMapper) | 

| [](https://github.com/tdavislab/PhenoMapper/issues)
[](https://github.com/tdavislab/PhenoMapper/pulls)
2024-04-22 ([`4cc2a66`](https://github.com/tdavislab/PhenoMapper/commits)) | 40 | [tdavislab/PhenoMapper](https://github.com/tdavislab/PhenoMapper) |
+| ⚪ [Covid Scenario model](https://github.com/HopkinsIDD/COVIDScenarioPipeline) | 



+5 more | [](https://github.com/HopkinsIDD/COVIDScenarioPipeline/issues)
[](https://github.com/HopkinsIDD/COVIDScenarioPipeline/pulls)
2023-02-21 ([`0c6084b`](https://github.com/HopkinsIDD/COVIDScenarioPipeline/commits)) | 2814 | [HopkinsIDD/COVIDScenarioPipeline](https://github.com/HopkinsIDD/COVIDScenarioPipeline) |
+| ⚪ [CU Metapopulation](https://github.com/epimodels/Metapopulation_MRSA) | 
| [](https://github.com/epimodels/Metapopulation_MRSA/issues)
[](https://github.com/epimodels/Metapopulation_MRSA/pulls)
2022-07-14 ([`35bf356`](https://github.com/epimodels/Metapopulation_MRSA/commits)) | 27 | [epimodels/Metapopulation_MRSA](https://github.com/epimodels/Metapopulation_MRSA) |
+| ⚪ [COVID-19 NCAA Football](https://github.com/epimodels/inperson_sports) |
| [](https://github.com/epimodels/inperson_sports/issues)
[](https://github.com/epimodels/inperson_sports/pulls)
2020-09-28 ([`9681971`](https://github.com/epimodels/inperson_sports/commits)) | 1 | [epimodels/inperson_sports](https://github.com/epimodels/inperson_sports) |
+| ⚪ [Post-acute care model](https://github.com/mattrmaloney/covid-post-acute-care) | No data | [](https://github.com/mattrmaloney/covid-post-acute-care/issues)
[](https://github.com/mattrmaloney/covid-post-acute-care/pulls)
2020-06-13 ([`b60c0a6`](https://github.com/mattrmaloney/covid-post-acute-care/commits)) | 14 | [mattrmaloney/covid-post-acute-care](https://github.com/mattrmaloney/covid-post-acute-care) |
+| ⚪ [COVID-19 Jail Model](https://github.com/epimodels/COVID19-Jails) |
| [](https://github.com/epimodels/COVID19-Jails/issues)
[](https://github.com/epimodels/COVID19-Jails/pulls)
2020-04-30 ([`561491b`](https://github.com/epimodels/COVID19-Jails/commits)) | 4 | [epimodels/COVID19-Jails](https://github.com/epimodels/COVID19-Jails) |
+| ⚪ [GeoCovid](https://github.com/Fernandez-Lab-WSU/geocovid_app) | No data | [](https://github.com/Fernandez-Lab-WSU/geocovid_app/issues)
[](https://github.com/Fernandez-Lab-WSU/geocovid_app/pulls)
No recent commits | N/A | [Fernandez-Lab-WSU/geocovid_app](https://github.com/Fernandez-Lab-WSU/geocovid_app) |
---
diff --git a/scripts/README.md b/scripts/README.md
index e922323..97fffbe 100644
--- a/scripts/README.md
+++ b/scripts/README.md
@@ -10,14 +10,36 @@ Main script that:
2. Filters projects that have GitHub repositories (`github_link` field)
3. Uses GitHub API to fetch project metrics:
- Contributors and their avatars
- - Number of open issues
+ - Number of open issues (excluding pull requests, which GitHub counts as issues)
- Number of open pull requests
- Last commit date and hash
- Total number of commits
-4. Generates a markdown table in `project_status.md`
+4. Looks up whether the project is published on CRAN (see below)
+5. Generates a markdown table in `project_status.md`, sorted by most recent
+ commit and prefixed with an activity summary
**Dependencies:** `yaml`, `data.table`, `httr`, `jsonlite`
+#### Counting collections
+
+GitHub does not report the size of paginated collections. The script asks for one
+item per page and reads the last page number from the `Link` header, which is
+exact and costs a single request. The previous approach used the search API,
+which is heavily rate limited and silently reports 0 commits for repositories it
+has not indexed.
+
+#### CRAN detection
+
+A project gets CRAN version and download badges when it can be matched to a CRAN
+package. The optional `cran_name` field in the project's YAML file is
+authoritative: set it to the package name to force a match (useful when the names
+differ, e.g. `epiworldR` for the `epiworld` repository), or to `no` to skip the
+lookup. Without it, the repository name and the first word of `tool_name` are
+checked against the CRAN index, and a match is only accepted when the package's
+CRAN metadata (`URL` or `BugReports`) points back at the same GitHub owner or
+repository. This keeps a project from being matched to an unrelated CRAN package
+that happens to share its name.
+
### `test_workflow.R`
Simple test script to verify the workflow infrastructure works without making API calls.
@@ -44,11 +66,15 @@ Rscript scripts/update_project_status.R
## Output
Generates `project_status.md` with:
-- Project name linked to GitHub repository
+- A summary of how many projects are active, slow, dormant, and on CRAN
+- Project name linked to GitHub repository, with an activity marker
+ (🟢 commit in the last 90 days, 🟡 in the last year, ⚪ older or unknown)
- Contributor avatars and count
- Issue and PR badges
- Last commit information
- Total commit count
-- Direct repository links
+- Direct repository links, followed by CRAN version and download badges for
+ projects published on CRAN
-The dashboard tracks approximately 19 EpiForeSITE projects with active GitHub repositories.
\ No newline at end of file
+The dashboard tracks the EpiForeSITE projects in `data/` that have a GitHub
+repository (currently 23).
\ No newline at end of file
diff --git a/scripts/update_project_status.R b/scripts/update_project_status.R
index 8eb5a8b..17ec62f 100755
--- a/scripts/update_project_status.R
+++ b/scripts/update_project_status.R
@@ -11,21 +11,25 @@ suppressMessages({
library(jsonlite)
})
-# Helper function to safely make GitHub API calls
+# Helper function to safely make GitHub API calls.
+# Returns the parsed body, with the response headers attached as the
+# "response_headers" attribute (needed to read pagination `Link` headers).
github_api_call <- function(url, token = NULL) {
headers <- list(
'Accept' = 'application/vnd.github+json',
'User-Agent' = 'EpiForeSITE-software-tracker'
)
-
+
if (!is.null(token)) {
headers[['Authorization']] <- paste0('Bearer ', token)
}
-
+
tryCatch({
response <- GET(url, do.call(add_headers, headers))
if (status_code(response) == 200) {
- return(fromJSON(content(response, as = "text")))
+ parsed <- fromJSON(content(response, as = "text"))
+ attr(parsed, "response_headers") <- headers(response)
+ return(parsed)
} else {
warning(paste("API call failed for", url, "- Status:", status_code(response)))
return(NULL)
@@ -36,6 +40,110 @@ github_api_call <- function(url, token = NULL) {
})
}
+# Size of a paginated collection (commits, contributors, pull requests, ...).
+# GitHub does not report collection sizes, but when one item is requested per
+# page the last page number in the `Link` header is the number of items. This is
+# exact and costs a single request - unlike the search API, which is heavily
+# rate limited and silently returns 0 while a repository is unindexed, and
+# unlike length(), which counts the columns of the parsed data frame.
+count_from_response <- function(response) {
+ # A failed request is unknown (NA), an empty collection is a genuine zero
+ if (is.null(response)) return(NA_integer_)
+ if (length(response) == 0) return(0L)
+
+ link <- attr(response, "response_headers")[["link"]]
+ if (!is.null(link)) {
+ last_page <- regmatches(link, regexec('[?&]page=([0-9]+)>; rel="last"', link))[[1]]
+ if (length(last_page) >= 2) return(as.integer(last_page[2]))
+ }
+
+ # No `Link` header means everything fit in the single requested page
+ 1L
+}
+
+github_count <- function(url, token = NULL) {
+ separator <- if (grepl("?", url, fixed = TRUE)) "&" else "?"
+ count_from_response(github_api_call(paste0(url, separator, "per_page=1"), token))
+}
+
+# ---------------------------------------------------------------------------
+# CRAN helpers
+# ---------------------------------------------------------------------------
+
+# Index of all package names currently on CRAN (downloaded once per run)
+cran_index <- local({
+ cached <- NULL
+ function() {
+ if (is.null(cached)) {
+ cached <<- tryCatch(
+ rownames(available.packages(repos = "https://cloud.r-project.org")),
+ error = function(e) {
+ warning(paste("Could not fetch the CRAN package index:", e$message))
+ character(0)
+ }
+ )
+ }
+ cached
+ }
+})
+
+# Package metadata (DESCRIPTION fields) from the CRAN database
+cran_metadata <- function(pkg) {
+ tryCatch({
+ response <- GET(
+ paste0("https://crandb.r-pkg.org/", pkg),
+ add_headers('User-Agent' = 'EpiForeSITE-software-tracker')
+ )
+ if (status_code(response) != 200) return(NULL)
+ fromJSON(content(response, as = "text", encoding = "UTF-8"))
+ }, error = function(e) NULL)
+}
+
+# Resolve the CRAN package a project corresponds to, if any.
+#
+# The YAML `cran_name` field takes precedence: give the package name to force a
+# match, or "no"/"none" to opt out. Without it, the repository name and the
+# first word of `tool_name` are tried against the CRAN index, and a hit is only
+# accepted when the CRAN metadata points back at the same GitHub owner or
+# repository (this is what keeps, e.g., a project named "rabies" from being
+# matched to an unrelated CRAN package of the same name).
+detect_cran_package <- function(cran_name, tool_name, owner, repo) {
+ declared <- !is.na(cran_name) && nzchar(cran_name) && cran_name != ".na.character"
+
+ if (declared) {
+ if (tolower(cran_name) %in% c("no", "none", "false")) return(NA_character_)
+ return(trimws(cran_name))
+ }
+
+ candidates <- unique(c(repo, trimws(sub(":.*$", "", tool_name))))
+ candidates <- candidates[!is.na(candidates) & !grepl("[^A-Za-z0-9.]", candidates)]
+ candidates <- candidates[candidates %in% cran_index()]
+
+ for (candidate in candidates) {
+ meta <- cran_metadata(candidate)
+ if (is.null(meta)) next
+ urls <- tolower(paste(c(meta$URL, meta$BugReports), collapse = " "))
+ same_owner <- !is.na(owner) && grepl(tolower(paste0("github.com/", owner, "/")), urls, fixed = TRUE)
+ same_repo <- !is.na(repo) && grepl(tolower(paste0("/", repo)), urls, fixed = TRUE)
+ if (same_owner || same_repo) return(candidate)
+ }
+
+ NA_character_
+}
+
+# CRAN version and download badges for a package, kept on one line so they sit
+# next to each other under the repository link
+create_cran_badges_html <- function(pkg) {
+ if (is.na(pkg)) return("")
+ cran_page <- paste0("https://cran.r-project.org/package=", pkg)
+ paste(
+ paste0("[](", cran_page, ")"),
+ paste0("[](", cran_page, ")"),
+ paste0("[](", cran_page, ")"),
+ sep = " "
+ )
+}
+
# Function to extract owner and repo from GitHub URL
extract_repo_info <- function(github_url) {
@@ -68,37 +176,42 @@ extract_repo_info <- function(github_url) {
get_project_metrics <- function(owner, repo, token = NULL) {
if (is.na(owner) || is.na(repo)) {
return(list(
- contributors = 0,
- open_issues = 0,
- open_prs = 0,
+ contributors = 0L,
+ open_issues = 0L,
+ open_prs = 0L,
last_commit_date = "Unknown",
last_commit_sha = "Unknown",
contributor_avatars = character(0),
- total_commits = -1
+ total_commits = NA_integer_
))
}
base_url <- paste0("https://api.github.com/repos/", owner, "/", repo)
- # Get repository info (includes open issues count)
+ # Get open pull requests
+ open_prs <- github_count(paste0(base_url, "/pulls?state=open"), token)
+
+ # Get repository info. Note that GitHub counts pull requests as issues in
+ # `open_issues_count`, so they are discounted to match the issues badge.
repo_info <- github_api_call(paste0(base_url), token)
- open_issues <- if (!is.null(repo_info)) repo_info$open_issues_count else 0
-
+ open_issues <- if (!is.null(repo_info)) {
+ max(0L, repo_info$open_issues_count - (if (is.na(open_prs)) 0L else open_prs))
+ } else {
+ NA_integer_
+ }
+
# Get contributors
- contributors_data <- github_api_call(paste0(base_url, "/contributors"), token)
- contributors_count <- if (!is.null(contributors_data)) length(contributors_data) else 0
+ contributors_count <- github_count(paste0(base_url, "/contributors"), token)
+ contributors_data <- github_api_call(paste0(base_url, "/contributors?per_page=10"), token)
contributor_avatars <- character(0)
if (!is.null(contributors_data) && length(contributors_data) > 0) {
- # Get up to first 10 contributors' avatars
- contributor_avatars <- head(contributors_data, 10)$avatar_url
+ contributor_avatars <- contributors_data$avatar_url
}
-
- # Get open pull requests
- pulls_data <- github_api_call(paste0(base_url, "/pulls?state=open"), token)
- open_prs <- if (!is.null(pulls_data)) length(pulls_data) else 0
-
- # Get last commit
- commits_data <<- github_api_call(paste0(base_url, "/commits?per_page=1"), token)
+
+ # Get last commit and the total commit count (single request, see helper)
+ commits_data <- github_api_call(paste0(base_url, "/commits?per_page=1"), token)
+ total_commits <- count_from_response(commits_data)
+
last_commit_date <- "Unknown"
last_commit_sha <- "Unknown"
if (!is.null(commits_data) && length(commits_data) > 0) {
@@ -107,53 +220,7 @@ get_project_metrics <- function(owner, repo, token = NULL) {
# Convert to readable date
last_commit_date <- as.Date(substr(last_commit_date, 1, 10))
}
-
- # Get total commits count using multiple methods for better reliability
- total_commits <- -1 # -1 indicates API failure
-
- # Method 1: Try search API first (gets total commits across entire repository history)
- # Note: This requires authentication and has rate limits, but gives accurate total counts
- search_url <- paste0("https://api.github.com/search/commits?q=repo:", owner, "/", repo)
- search_data <- github_api_call(search_url, token)
- if (!is.null(search_data) && !is.null(search_data$total_count)) {
- total_commits <- search_data$total_count
- } else {
- # Method 2: Try getting repository statistics for contributor activity
- # This might give us a better estimate than participation stats
- stats_url <- paste0(base_url, "/stats/contributors")
- contributors_stats <- github_api_call(stats_url, token)
- if (!is.null(contributors_stats) && length(contributors_stats) > 0) {
- # Sum up all contributions from all contributors
- total_commits <- sum(sapply(contributors_stats, function(contributor) {
- # Handle both atomic vectors and list/data.frame structures
- if (is.null(contributor)) {
- 0
- } else if (is.list(contributor) && !is.null(contributor[["total"]])) {
- contributor[["total"]]
- } else {
- 0
- }
- }), na.rm = TRUE)
- } else {
- # Method 3: Fallback to participation stats (last 52 weeks only)
- stats_data <- github_api_call(paste0(base_url, "/stats/participation"), token)
- if (!is.null(stats_data) && !is.null(stats_data$all)) {
- # This gives us commits from last 52 weeks only - not ideal but better than nothing
- total_commits <- sum(stats_data$all, na.rm = TRUE)
- } else {
- # Method 4: Last resort - check if any commits exist
- commits_page <- github_api_call(paste0(base_url, "/commits?per_page=1"), token)
- if (!is.null(commits_page) && length(commits_page) > 0) {
- # Repository has commits but we can't get count - return -1 to indicate API limitation
- total_commits <- -1
- } else {
- # No commits found
- total_commits <- 0
- }
- }
- }
- }
-
+
return(list(
contributors = contributors_count,
open_issues = open_issues,
@@ -242,15 +309,21 @@ main <- function() {
sapply(repo_info, "[[", "repo")
)}]
+ # `cran_name` is optional, so it may be missing from every YAML file
+ if (!"cran_name" %in% names(projects_with_github)) {
+ projects_with_github[, cran_name := NA_character_]
+ }
+
# Initialize metrics columns
projects_with_github[, `:=`(
contributors = as.integer(0),
- open_issues = as.integer(0),
+ open_issues = as.integer(0),
open_prs = as.integer(0),
last_commit_date = as.character("Unknown"),
last_commit_sha = as.character("Unknown"),
contributor_avatars_html = as.character(""),
- total_commits = as.integer(-1)
+ total_commits = NA_integer_,
+ cran_package = NA_character_
)]
# Get metrics for each project (with progress tracking)
@@ -264,7 +337,13 @@ main <- function() {
if (!is.na(owner) && !is.na(repo)) {
metrics <- get_project_metrics(owner, repo, github_token)
-
+ # Note: not named `cran_package`, which `:=` below would read as the column
+ cran_pkg <- detect_cran_package(
+ projects_with_github$cran_name[i],
+ projects_with_github$tool_name[i],
+ owner, repo
+ )
+
projects_with_github[i, `:=`(
contributors = metrics$contributors,
open_issues = metrics$open_issues,
@@ -272,11 +351,15 @@ main <- function() {
last_commit_date = as.character(metrics$last_commit_date),
last_commit_sha = metrics$last_commit_sha,
contributor_avatars_html = create_avatars_html(metrics$contributor_avatars),
- total_commits = metrics$total_commits
+ total_commits = metrics$total_commits,
+ cran_package = cran_pkg
)]
-
+
# Log some info about what we found
cat(paste(" ->", metrics$contributors, "contributors,", metrics$open_issues, "issues,", metrics$open_prs, "PRs\n"))
+ if (!is.na(cran_pkg)) {
+ cat(paste(" -> on CRAN as", cran_pkg, "\n"))
+ }
} else {
cat(" -> Invalid repository info, skipping API calls\n")
}
@@ -287,6 +370,17 @@ main <- function() {
}
}
+ # Sort by most recent activity so the projects moving right now come first
+ projects_with_github[, last_commit_as_date := as.Date(last_commit_date, optional = TRUE)]
+ setorder(projects_with_github, -last_commit_as_date, na.last = TRUE)
+
+ # Activity summary
+ today <- Sys.Date()
+ days_since <- as.numeric(today - projects_with_github$last_commit_as_date)
+ n_active <- sum(!is.na(days_since) & days_since <= 90)
+ n_recent <- sum(!is.na(days_since) & days_since > 90 & days_since <= 365)
+ n_cran <- sum(!is.na(projects_with_github$cran_package))
+
# Generate markdown table
markdown_content <- c(
"# Project Status Dashboard",
@@ -295,19 +389,35 @@ main <- function() {
"",
paste("This dashboard tracks", nrow(projects_with_github), "EpiForeSITE projects with GitHub repositories."),
"",
+ "| | |",
+ "|---|---|",
+ paste0("| 🟢 Active (commit in the last 90 days) | ", n_active, " |"),
+ paste0("| 🟡 Slow (commit in the last year) | ", n_recent, " |"),
+ paste0("| ⚪ Dormant (no commit in over a year) | ", nrow(projects_with_github) - n_active - n_recent, " |"),
+ paste0("| 📦 Published on CRAN | ", n_cran, " |"),
+ paste0("| Open issues / open PRs | ",
+ sum(projects_with_github$open_issues, na.rm = TRUE), " / ",
+ sum(projects_with_github$open_prs, na.rm = TRUE), " |"),
+ "",
+ "Projects are sorted by most recent commit.",
+ "",
"| Project | Contributors | Issues, PRs, and Last Commit | Commits | Repository |",
- "|---------|-------------|--------------------------|---------|------------|"
+ "|---------|--------------|------------------------------|---------|------------|"
)
-
+
# Create table rows
for (i in seq_len(nrow(projects_with_github))) {
row <- projects_with_github[i]
-
+
+ # Activity marker, matching the summary above
+ days <- as.numeric(today - row$last_commit_as_date)
+ activity <- if (is.na(days)) "⚪" else if (days <= 90) "🟢" else if (days <= 365) "🟡" else "⚪"
+
project_name <- ifelse(is.na(row$tool_name) || row$tool_name == "", "Unnamed Project", row$tool_name)
github_link <- row$github_link
# Handle missing or invalid data gracefully
- contributors_display <- if (row$contributors > 0) {
+ contributors_display <- if (isTRUE(row$contributors > 0)) {
if (nchar(row$contributor_avatars_html) > 0) {
row$contributor_avatars_html
} else {
@@ -339,24 +449,30 @@ main <- function() {
# Combine Issues, PRs, and Last Commit into single column with line breaks
combined_issues_prs_commits <- paste(issues_display, prs_display, last_commit_display, sep = "
")
- commits_display <- if (row$total_commits >= 0) {
+ commits_display <- if (isTRUE(row$total_commits >= 0)) {
as.character(row$total_commits)
} else {
"N/A"
}
+ # CRAN badges, when the project is on CRAN, sit under the repository link
repo_cell <- paste0("[", row$owner, "/", row$repo, "](", github_link, ")")
-
- table_row <- paste(
- paste0("| [", project_name, "](", github_link, ")"),
- contributors_display,
- combined_issues_prs_commits,
- commits_display,
- repo_cell,
- "|",
- sep = " | "
+ cran_display <- create_cran_badges_html(row$cran_package)
+ if (nzchar(cran_display)) {
+ repo_cell <- paste(repo_cell, cran_display, sep = "
")
+ }
+
+ table_row <- paste0(
+ "| ", paste(
+ paste0(activity, " [", project_name, "](", github_link, ")"),
+ contributors_display,
+ combined_issues_prs_commits,
+ commits_display,
+ repo_cell,
+ sep = " | "
+ ), " |"
)
-
+
markdown_content <- c(markdown_content, table_row)
}