BiocMaintainerQueries: R functions to query Bioconductor Maintainer Validation App

Background

This package is an accompaniment to the Bioconductor Maintainer Validation App. It displays a list of the currently active Bioconductor packages and their maintainers. The Bioconductor Maintainer Validation App sends a reminder email to maintainers of Bioconductor policies and procedures. Maintainers are required to opt-in to the Bioconductor policies once a year. This vignette demonstrates convenient wrappers to the application api for common queries against the database. See also the BiocMaintainerShiny vignette for how to launch the accompanied shiny app.

Installation

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")

BiocManager::install("BiocMaintainerApp")

Loading the package

library(BiocMaintainerApp)

Helper functions for common queries

This package provides convenient R functions that wrap around the Bioconductor Maintainer Validation App API.

Retrieve Maintainer and Package Information

There are three functions that return data.frames of maintainer information that include: name, package, email, consent_date, email_status, is_email_valid. These functions take either the package name, maintainer email, or maintainer name as argument:

  • getInfoByPackage
  • getInfoByEmail
  • getInfoByName

## By package name
getInfoByPackage("BiocFileCache")
#>         package          name                         email consent_date
#> 1 BiocFileCache Lori Shepherd lori.shepherd@roswellpark.org   2025-12-01
#>   email_status is_email_valid
#> 1        valid              1

## By maintainer email
tbl <- getInfoByEmail("maintainer@bioconductor.org")
head(tbl)
#>                         email                            name           package
#> 1 maintainer@bioconductor.org Bioconductor Package Maintainer          annotate
#> 2 maintainer@bioconductor.org Bioconductor Package Maintainer     AnnotationDbi
#> 3 maintainer@bioconductor.org Bioconductor Package Maintainer  AnnotationFilter
#> 4 maintainer@bioconductor.org Bioconductor Package Maintainer   AnnotationForge
#> 5 maintainer@bioconductor.org Bioconductor Package Maintainer     AnnotationHub
#> 6 maintainer@bioconductor.org Bioconductor Package Maintainer AnnotationHubData
#>   consent_date email_status is_email_valid
#> 1   2025-12-01        valid              1
#> 2   2025-12-01        valid              1
#> 3   2025-12-01        valid              1
#> 4   2025-12-01        valid              1
#> 5   2025-12-01        valid              1
#> 6   2025-12-01        valid              1

## By maintainer name
## Then list packages associated
tbl <- getInfoByName("Hervé Pagès")
head(tbl$package)
#> [1] "BiocGenerics"  "Biostrings"    "BSgenome"      "BSgenomeForge"
#> [5] "DelayedArray"  "GenomeInfoDb"

There is also a function that takes an email and returns if it is valid or not. If it is not valid, it will also return a data.frame of additional information collected to try to indicate the resason for the failed delivery. The return value of this function is a list with argument ‘valid’ and optionally ‘data’.

  • isEmailValid
isEmailValid("maintainer@bioconductor.org")
#> $valid
#> [1] TRUE

List Maintainer Emails

There are four list functions to help retrieve emails that are not necessarily valid either because emails cannot be delivered to the email or the maintainer has not consented to Bioconductor policies in the last year.

  • listInvalid
  • listNeedsConsent
  • listAllBadEmails
  • listEmailsOnSuppressionList
## list invalid
## maintainers that emails cannot be delivered and any information on failure
## this is a data.frame
tbl <- listInvalid()
head(tbl)
#>                        email               name     package email_status
#> 1 wyang@zoologie.uni-kiel.de        Wentao Yang      ABSSeq   suppressed
#> 2 dimitrov@stat.Berkeley.EDU     Peter Dimitrov        aCGH   suppressed
#> 3       sdavis2@mail.nih.gov         Sean Davis        ACME   suppressed
#> 4      cuilan.gao@stjude.org    Cuilan lani Gao       AGDEX      bounced
#> 5             plopez@cnic.es Pedro Lopez-Romero AgiMicroRna   suppressed
#> 6        wancen@live.unc.edu          Wancen Mu     airpart   suppressed
#>   bounce_type bounce_subtype smtp_status
#> 1      BOUNCE           <NA>        <NA>
#> 2      BOUNCE           <NA>        <NA>
#> 3      BOUNCE           <NA>        <NA>
#> 4   Permanent        General      5.1.10
#> 5      BOUNCE           <NA>        <NA>
#> 6      BOUNCE           <NA>        <NA>
#>                                                                              diagnostic_code
#> 1                                                                  2026-01-11 03:07:31 +0000
#> 2                                                                  2026-01-11 03:00:20 +0000
#> 3                                                                  2025-11-24 17:18:43 +0000
#> 4 smtp;550 5.1.10 RESOLVER.ADR.RecipientNotFound; Recipient not found by SMTP address lookup
#> 5                                                                  2025-02-25 17:00:05 +0000
#> 6                                                                  2026-01-11 03:00:29 +0000

## list needs consent
## maintainers have not consented to policies in the last year
tbl <- listNeedsConsent()    
head(tbl)
#> [1] "jiahfong@gmail.com"         "wyang@zoologie.uni-kiel.de"
#> [3] "jpacostar@unal.edu.co"      "dimitrov@stat.Berkeley.EDU"
#> [5] "sdavis2@mail.nih.gov"       "jlhayes1982@gmail.com"

## list bad emails
## combo: invalid and needs consent
tbl <- listAllBadEmails()
head(tbl)
#> [1] "jiahfong@gmail.com"         "wyang@zoologie.uni-kiel.de"
#> [3] "jpacostar@unal.edu.co"      "dimitrov@stat.Berkeley.EDU"
#> [5] "sdavis2@mail.nih.gov"       "jlhayes1982@gmail.com"

## list suppression list
## emails that appear on aws suppression list and would not try to send
## this is list. 'data' element contains a data.frame of name and email
tbl <- listEmailsOnSuppressionList()
head(tbl$data)
#>                        email               name
#> 1 wyang@zoologie.uni-kiel.de        Wentao Yang
#> 2 dimitrov@stat.Berkeley.EDU     Peter Dimitrov
#> 3       sdavis2@mail.nih.gov         Sean Davis
#> 4             plopez@cnic.es Pedro Lopez-Romero
#> 5        wancen@live.unc.edu          Wancen Mu
#> 6       dxl466@cs.bham.ac.uk            Dong Li

Retreive Database

If the prebuilt functions are not sufficient and you would like to perform your own analysis, there is a function to download the current version of the database.

  • get_maintainer_data

all_data <- get_maintainer_data()
tail(all_data)
#>          package            name                                   email
#> 3924   carnation   Apratim Mitra                   apratim.mitra@nih.gov
#> 3925     DenoIST      Aaron Kwok                        akwok@svi.edu.au
#> 3926 glycoTraitR  Bingyuan Zhang zhang.bingyuan.w8@f.mail.nagoya-u.ac.jp
#> 3927 animalcules W. Evan Johnson                              wej@bu.edu
#> 3928     BatchQC      Yaoan Leng                             leng@bu.edu
#> 3929      Rfastp        Wei Wang              periwinkle.david@gmail.com
#>      consent_date email_status is_email_valid last_verification_sent
#> 3924   2026-02-11          new           TRUE                   <NA>
#> 3925   2026-02-11          new           TRUE                   <NA>
#> 3926   2026-02-11          new           TRUE                   <NA>
#> 3927   2026-02-13          new           TRUE                   <NA>
#> 3928   2026-02-13          new           TRUE                   <NA>
#> 3929   2026-02-13          new           TRUE                   <NA>
#>      bounce_type bounce_subtype smtp_status diagnostic_code needs_consent
#> 3924        <NA>           <NA>        <NA>            <NA>         FALSE
#> 3925        <NA>           <NA>        <NA>            <NA>         FALSE
#> 3926        <NA>           <NA>        <NA>            <NA>         FALSE
#> 3927        <NA>           <NA>        <NA>            <NA>         FALSE
#> 3928        <NA>           <NA>        <NA>            <NA>         FALSE
#> 3929        <NA>           <NA>        <NA>            <NA>         FALSE

The following provide brief descriptions of columns:

  • package: name of Bioconductor package
  • name: maintainers name
  • email: maintainers provided email in package DESCRIPTION
  • consent_date: last known consent date to Bioconductor policies
  • email_status: (Initialized, valid, suppressed, bounce, new)
  • is_email_valid: true/false if the email could be delivered
  • last_verification_sent: when was the last verification email sent

The remaining columns are utilized if additional information when an email is bounced can be retrieved. This is used as potential diagnostic and resolution.

  • bounce_type
  • bounce_subtype
  • smtp_status
  • diagnostic_code

Session Info

sessionInfo()
#> R version 4.5.2 (2025-10-31)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.3 LTS
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=C              
#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] BiocMaintainerApp_0.99.0 BiocStyle_2.39.0        
#> 
#> loaded via a namespace (and not attached):
#>  [1] cli_3.6.5           knitr_1.51          rlang_1.1.7        
#>  [4] xfun_0.56           otel_0.2.0          promises_1.5.0     
#>  [7] shiny_1.12.1        xtable_1.8-4        jsonlite_2.0.0     
#> [10] DT_0.34.0           buildtools_1.0.0    htmltools_0.5.9    
#> [13] maketools_1.3.2     httpuv_1.6.16       sys_3.4.3          
#> [16] sass_0.4.10         rmarkdown_2.30      evaluate_1.0.5     
#> [19] jquerylib_0.1.4     shinyjs_2.1.1       fastmap_1.2.0      
#> [22] yaml_2.3.12         lifecycle_1.0.5     BiocManager_1.30.27
#> [25] compiler_4.5.2      codetools_0.2-20    Rcpp_1.1.1         
#> [28] htmlwidgets_1.6.4   later_1.4.5         digest_0.6.39      
#> [31] R6_2.6.1            magrittr_2.0.4      bslib_0.10.0       
#> [34] tools_4.5.2         mime_0.13           shinythemes_1.2.0  
#> [37] cachem_1.1.0