Skip to content

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.csv are 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

6 of 6 sources refreshed 2026-08-31 — 2 sources incomplete: bioconductor, ecosystems
Source Status Last collected Age Records Completeness
bioconductor degraded 2026-08-31 0 d 0 incomplete
citations ok 2026-08-31 0 d 11 7 of 7 papers
dockerhub ok 2026-08-31 0 d 1
ecosystems degraded 2026-08-31 0 d 20 incomplete
github ok 2026-08-31 0 d 47
rsd ok 2026-08-31 0 d 1

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.

Made no requests on the last run.

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.

1 request on 2026-08-31, status ok, 11 records kept.

citations11 recordsapi.openalex.org/workspaper_citations4 recordspaper_citations_by_doi7 records

Every request, in the order it was made
# URL What came back
1 https://api.openalex.org/works 7 DOIs asked, 7 returned

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.

1 request on 2026-08-31, status ok, 1 records kept.

dockerhub1 recordshub.docker.com/v2/repositories/simolecu…docker_pulls_total1 records

Every request, in the order it was made
# URL What came back
1 https://hub.docker.com/v2/repositories/simolecule/cdkdepict// cdkdepict

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.

8 requests on 2026-08-31, status degraded, 20 records kept.

ecosystems20 recordspackages.ecosyste.ms/api/v1/registries/…x8package_dependents8 recordspackage_downloads_recent2 recordspackage_downloads_total2 recordsregistry_breadth8 records

Every request, in the order it was made
# URL What came back
1 https://packages.ecosyste.ms/api/v1/registries/repo1.maven.org/packages/org.openscience.cdk:cdk-bundle cdk
2 https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/cdk cdk
3 https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/cdk cdk
4 https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/cdk cdk
5 https://packages.ecosyste.ms/api/v1/registries/repo1.maven.org/packages/org.openscience.cdk:cdk-scaffold scaffolds
6 https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/CDK-pywrapper cdkpywrap
7 https://packages.ecosyste.ms/api/v1/registries/cran.r-project.org/packages/rcdk cdkr
8 https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/r-rcdk cdkr

Reported a problem

flathub.org/io.github.jchempaint.JChemPaint: GET https://packages.ecosyste.ms/api/v1/registries/flathub.org/packages/io.github.jchempaint.JChemPaint: HTTP 404

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.

1 request on 2026-08-31, status ok, 47 records kept.

github47 recordsapi.github.com/graphqllatest_release6 recordsreleases_by_year35 recordsrepos_active6 records

Every request, in the order it was made
# URL What came back
1 https://api.github.com/graphql (8 repositories) 8 of 8 returned: cdk/cdk, cdk/depict, jchempaint/jchempaint, cdk/nodes4knime-cdk2, cdk/nodes4knime, cdk/cdk-scaffold, OlivierBeq/CDK_pywrapper, CDK-R/cdkr

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-08-31, status ok, 1 records kept.

rsd1 recordsresearch-software-directory.org/api/v1/…rsd_mentions1 records

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