Methods¶
Everything comes from public APIs, collected weekly by a job in this repository. No manual data entry, no database, and no credential beyond the token GitHub issues to its own workflow.
What counts as TGX¶
The tracked list is config/projects.csv:
software and data resources the department builds or co-maintains, each named
explicitly with the repositories, packages, images, endpoints and papers that belong to
it. Nothing is discovered by matching a person, an affiliation string or an ORCID, so
nothing arrives in a figure because a name looked right.
No person is queried and none is stored. The department's publication record is a separate thing, held in Pure, and this page does not reproduce it.
Rules the pipeline enforces¶
Each exists because a dashboard like this has failed that way before. A record that trips one is quarantined into the run manifest with its reason and never published.
| Rule | Prevents |
|---|---|
semantics_gate |
a figure appearing without a definition of what it counts |
period_class |
a running total being filed under a month, which produces identical rows and a headline that sums the same number repeatedly |
future_period |
upstream placeholder rows entering the series. Bioconductor ships a zero row for every remaining month of the year |
no_silent_zero |
a value collapsing to zero and being published as fact |
monotonic |
a lifetime counter appearing to go backwards |
empty_result |
a source returning HTTP 200 with no rows being read as "nothing to report" while the last good value ages |
rate_limited |
a 429 being absorbed into "handled", which freezes a series while the page claims it is current |
volume_drop |
a collapse in record count being promoted |
Freshness comes from each source's own collection timestamp, never from the build clock. Amber past twice a source's cadence, red past five times.
Blind spots¶
A gap that is not declared reads as a zero, so:
- Container pulls come from Docker Hub, which is the only registry that publishes a count. An image pushed only to GitHub's registry or another one has no usage figure here, and none of them offer an API that would give one.
- GitHub page views and clones are not collected. They need push access to every repository, which means storing a token, and this runs without secrets. The window is 14 days anyway.
- PyPI download history cannot be backfilled. The public API keeps about 180 days.
- The Research Software Directory only knows registered tools. Software nobody registered shows no mentions, which is a good argument for registering it.
- Only the projects listed in
config/projects.csvare counted. A missing tool means nobody has added it yet, and adding one is a row in a table. - Citations are counted for the papers a project declares. A tool with no paper of its own therefore shows none, however much it is used.
Collection status¶
| Source | Status | Last collected | Age | Records | Completeness |
|---|---|---|---|---|---|
bioconductor |
ok | 2026-09-01 | 0 d | 518 | — |
citations |
degraded | 2026-09-01 | 0 d | 48 | 34 of 35 papers |
dockerhub |
ok | 2026-09-01 | 0 d | 2 | — |
ecosystems |
ok | 2026-09-01 | 0 d | 60 | — |
github |
ok | 2026-09-01 | 0 d | 124 | — |
rsd |
ok | 2026-09-01 | 0 d | 10 | — |
Sources are collected independently, so one broken API degrades one section and the page still builds with that section marked stale rather than showing last week's number as if it were current.
Open an issue. Every figure links to its data, and the run manifests record what each source returned and what failed.
The sources¶
One section per source: what it is, what this project takes from it, the shape of what it asks for, and every request from the last run. Generated from the run manifest, so it describes what actually happened rather than what the code is meant to do.
What is republished here are derived aggregates, never a verbatim copy of anyone's dataset. Where a source publishes no licence for its statistics, the figure is shown with a link back rather than redistributed. If you maintain one of these services and would rather this project used your data differently, please open an issue.
Every URL below can be pasted into a browser — they are all public and none needs a
key — and the answer you get is the answer this page got. In a diagram, requests are on
the left, the collector in the middle, the metrics it produced on the right; a box
marked ×19 is one endpoint asked nineteen times, and … marks a segment that varied
between calls. The literal URLs are in the tables, never abbreviated.
Bioconductor¶
bioconductor · https://bioconductor.org/packages/stats/ · terms: courtesy statistics files with no stated licence; aggregates only, with attribution
| Publishes | ||
|---|---|---|
| Bioconductor distinct IPs per month | bioc_distinct_ips_monthly, per month |
Distinct IP addresses downloading a package in a month. |
| Bioconductor downloads per month | bioc_downloads_monthly, per month |
Downloads recorded by Bioconductor for a package in a month. |
| Bioconductor download rank | bioc_rank, level |
Position in Bioconductor's published download score table. |
2 requests on 2026-09-01, status ok, 518 records kept.
Every request, in the order it was made
| # | URL | What came back |
|---|---|---|
| 1 | https://bioconductor.org/packages/stats/bioc/bioc_pkg_stats.tab |
all packages, all months, one file |
| 2 | https://bioconductor.org/packages/stats/bioc/bioc_pkg_scores.tab |
download score table |
OpenAlex¶
citations · https://openalex.org · terms: CC0
| Publishes | ||
|---|---|---|
| Citations of the tool's papers | paper_citations, level |
Citations to every paper describing a tool, summed across its update papers. |
| Citations per paper | paper_citations_by_doi, level |
Citations to one paper, from OpenAlex. |
2 requests on 2026-09-01, status degraded, 48 records kept.
Every request, in the order it was made
| # | URL | What came back |
|---|---|---|
| 1 | https://api.openalex.org/works |
25 DOIs asked, 24 returned |
| 2 | https://api.openalex.org/works |
10 DOIs asked, 10 returned |
Reported a problem
OpenAlex has no record for 1 DOI(s): 10.6084/m9.figshare.7346384
Docker Hub¶
dockerhub · https://hub.docker.com · terms: Docker terms of service
| Publishes | ||
|---|---|---|
| Container pulls, all time | docker_pulls_total, level |
Docker Hub's lifetime pull counter for an image. |
2 requests on 2026-09-01, status ok, 2 records kept.
Every request, in the order it was made
| # | URL | What came back |
|---|---|---|
| 1 | https://hub.docker.com/v2/repositories/bigcatum/bridgedb/ |
bridgedb |
| 2 | https://hub.docker.com/v2/repositories/vhp4safety/virtual-human-platform/ |
vhp |
ecosyste.ms¶
ecosystems · https://ecosyste.ms · terms: CC-BY-SA 4.0
| Publishes | ||
|---|---|---|
| Packages depending on it | package_dependents, level |
Other published packages that declare a dependency on one of these, as counted by the registry it is published in. |
| Registry downloads, last 30 days | package_downloads_recent, per none |
Downloads in the last 30 days, as reported by registries that publish no lifetime counter. |
| Registry downloads, all time | package_downloads_total, level |
The registry's own lifetime download counter, for registries that publish one. |
| Registries published to | registry_breadth, level |
Distinct registries carrying an artefact built from a department repository. |
27 requests on 2026-09-01, status ok, 60 records kept.
Every request, in the order it was made
| # | URL | What came back |
|---|---|---|
| 1 | https://packages.ecosyste.ms/api/v1/registries/bioconductor.org/packages/BridgeDbR |
bridgedb |
| 2 | https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/bridgedb |
bridgedb |
| 3 | https://packages.ecosyste.ms/api/v1/registries/repo1.maven.org/packages/org.bridgedb:org.bridgedb.bio |
bridgedb |
| 4 | https://packages.ecosyste.ms/api/v1/registries/bioconductor.org/packages/rWikiPathways |
wikipathways |
| 5 | https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pywikipathways |
wikipathways |
| 6 | https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/@wikipathways/pvjs |
wikipathways |
| 7 | https://packages.ecosyste.ms/api/v1/registries/repo1.maven.org/packages/org.pathvisio:org.pathvisio.libgpml |
pathvisio |
| 8 | https://packages.ecosyste.ms/api/v1/registries/repo1.maven.org/packages/org.openscience.cdk:cdk-bundle |
cdk |
| 9 | https://packages.ecosyste.ms/api/v1/registries/repo1.maven.org/packages/org.openscience.cdk:cdk-core |
cdk |
| 10 | https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/cdk |
cdk |
| 11 | https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/cdk |
cdk |
| 12 | https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/cdk |
cdk |
| 13 | https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/r-rcdk |
cdk |
| 14 | https://packages.ecosyste.ms/api/v1/registries/cran.r-project.org/packages/rcdk |
cdk |
| 15 | https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pybacting |
bacting |
| 16 | https://packages.ecosyste.ms/api/v1/registries/repo1.maven.org/packages/io.github.egonw.bacting:managers-cheminfo |
bacting |
| 17 | https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pybiodatafuse |
biodatafuse |
| 18 | https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pysec2pri |
sec2pri |
| 19 | https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/rdfsolve |
rdfsolve |
| 20 | https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/cmlxom |
blue-obelisk |
| 21 | https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/cmlxom |
blue-obelisk |
| 22 | https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/libeuclid-java |
blue-obelisk |
| 23 | https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/libeuclid-java |
blue-obelisk |
| 24 | https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/bodr |
blue-obelisk |
| 25 | https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/bodr |
blue-obelisk |
| 26 | https://packages.ecosyste.ms/api/v1/registries/repo1.maven.org/packages/io.github.egonw:nanojava |
nanojava |
| 27 | https://packages.ecosyste.ms/api/v1/registries/repo1.maven.org/packages/com.github.egonw:jqudt |
jqudt |
GitHub¶
github · https://docs.github.com/en/graphql · terms: GitHub API terms of service
| Publishes | ||
|---|---|---|
| Last release | latest_release, level |
The date of a project's most recent release or tag. |
| Releases per year | releases_by_year, per year |
A tagged release of a project's repositories, from GitHub Releases and git tags. |
| Repositories active in the last year | repos_active, level |
A project's repositories pushed to in the last 365 days. |
5 requests on 2026-09-01, status ok, 124 records kept.
Every request, in the order it was made
| # | URL | What came back |
|---|---|---|
| 1 | https://api.github.com/graphql (10 repositories) |
10 of 10 returned: bridgedb/datasources, bridgedb/BridgeDb, bridgedb/BridgeDbWebservice, bridgedb/bridgedbjs, bridgedb/docker, BiGCAT-UM/BridgeDbR, wikipathways/rWikiPathways, wikipathways/pywikipathways, wikipathways/pvjs, wikipathways/wikipathways-database |
| 2 | https://api.github.com/graphql (10 repositories) |
10 of 10 returned: wikipathways/GPML2RDF, wikipathways/WikiPathwaysCurator, PathVisio/pathvisio, PathVisio/libGPML, egonw/org.pathvisio.io.rdf, cdk/cdk, cdk/cdk-scaffold, egonw/bacting, blueobelisk/pybacting, BiGCAT-UM/ArrayAnalysis |
| 3 | https://api.github.com/graphql (10 repositories) |
10 of 10 returned: TGX-UM/R-ODAF-Shiny, VHP4Safety/virtual-human-platform, VHP4Safety/cloud, VHP4Safety/ui-casestudy-config, VHP4Safety/glossary, marvinm2/AOPWikiRDF, marvinm2/AOP-Wiki-Snorql-UI, marvinm2/AOP-Wiki-RDF-dashboard, marvinm2/molAOP-builder, marvinm2/molAOP-analyser |
| 4 | https://api.github.com/graphql (10 repositories) |
10 of 10 returned: BioDataFuse/pyBiodatafuse, BioDataFuse/biodatafuseUI, sec2pri/pysec2pri, jmillanacosta/rdfsolve, blueobelisk/euclid, blueobelisk/cmlxom, blueobelisk/iupac-names, blueobelisk/bodr, WDscholia/scholia, enanomapper/nanojava |
| 5 | https://api.github.com/graphql (2 repositories) |
2 of 2 returned: egonw/jqudt, CyTargetLinker/cytargetlinker |
Research Software Directory¶
rsd · https://research-software-directory.org · terms: platform Apache-2.0, content CC-BY
| Publishes | ||
|---|---|---|
| Papers mentioning the software | rsd_mentions, level |
Works the Research Software Directory records as mentioning a tool. |
1 request on 2026-09-01, status ok, 10 records kept.
Every request, in the order it was made
| # | URL | What came back |
|---|---|---|
| 1 | https://research-software-directory.org/api/v1/rpc/software_by_organisation?organisation_id=34e58775-bba6-48ee-9e0e-d1821cd33108 |
28 software entries |
Charts and icons¶
Charts are drawn with Vega-Lite (BSD-3-Clause),
vendored into docs/assets/js/ and pinned rather than loaded from a CDN, so the page
renders the same in five years and archives intact. The site itself is built with
MkDocs Material (MIT).
The type and the icons work the same way. Open Sans
(Apache-2.0) is the substitute UM's own web guidance names for Thesis Sans, its licensed
house typeface; the four subset faces are served from this repository, licence included.
The tile icons are inline SVG taken from Simple Icons
(CC0-1.0) and Octicons (MIT); the brand marks belong to
their owners, and they are there to say which registry a number came from. The project
logos work the same way: each is the mark that project publishes in its own repository,
copied into docs/assets/images/logos/ so the page fetches nothing, and shown only to
identify the tool whose figures sit beneath it. Every one of them remains the property
of the project that made it. A project with no mark of its own gets initials instead.
Nothing on this page is requested from anyone else.
The TGX logo and icon are the department's own marks. Colours follow the UM house style,
and the chart series take the department's own #00A2DB and #E84E10.
| File | Version | SHA-384 |
|---|---|---|
vega.min.js |
5.30.0 | em7CHpJd+SsMugVFf6TY7AKQcLWMcbPhD84hmNK8o6WFDkK+2uHSUQRVQV1/w827 |
vega-lite.min.js |
5.21.0 | GhkD6ks9/zgY1m5EFOUZWz/vMVMUFF/92DL61RZc+B42J8osL+jNufKv68bNHHZ2 |
vega-embed.min.js |
6.26.0 | TqXb8su49m5OnEpKGO8m+VrgHesrUxyP22HgpXi4hnh1Hm43dXroiSYemNf5D8lv |