Static feed of releases across Jumoo's NuGet packages, combining NuGet version/publish data with GitHub release notes (including from private repos). Published via GitHub Pages at releases.jumoo.co.uk.
data/packages.jsonlists the tracked packages (NuGet package ID + GitHub repo).scripts/fetch-releases.mjsfetches version data from the NuGet API and release notes from the GitHub Releases API, merges them, and writesdocs/releases.jsonanddocs/feed.xml. It also writesdocs/activity.json(see below).docs/is a plain static site (no build step) that fetchesreleases.jsonand renders it. This is also the GitHub Pages publish directory..github/workflows/update-releases.ymlruns the fetch script every 6 hours (and on manual trigger), committing the regenerated JSON/feed if anything changed. Since Pages serves straight fromdocs/onmain, the commit itself triggers a redeploy.
Add an entry to data/packages.json. Its shape is described by data/packages.schema.json — .vscode/settings.json wires that schema up for autocomplete/validation in VS Code.
{
"nugetId": "Jumoo.SomePackage",
"aliasNugetIds": ["Jumoo.SomePackage.Old"],
"title": "Some Package",
"category": "Integrations",
"githubRepo": "Jumoo/SomePackage"
}nugetId— the current NuGet package ID (used to build package links and as the site's canonical package key).aliasNugetIds— optional list of prior NuGet IDs the package has shipped under (e.g. after a rename); their version history and download counts are fetched and merged intonugetId's totals. Omit if the package has never changed ID.title— display name shown on the site; falls back tonugetIdif omitted.category— groups packages into sections on the homepage (e.g. "uSync", "Integrations"); omit it to leave a package uncategorized — uncategorized packages are listed first, with no heading.githubRepo—owner/repofor releases, branches, and commits (the code repo).issuesRepo— optionalowner/repofor issues and PRs, when different fromgithubRepo— e.g. a package whose code lives in a private repo but whose issues are tracked in a separate public*.Issuesrepo. Omit if issues/PRs live ingithubRepoitself.
No code changes needed — the next scheduled run (or a manual workflow_dispatch) will pick it up.
By default, category sections on the homepage and versions page are ordered by whichever category had the most recent release (the uncategorized group always comes first, with no heading). To pin a specific order instead, list category names in docs/categories.json, e.g.:
["uSync Addon", "Translation Connectors", "Other"]Categories listed there are shown in that order, before any unlisted categories (which keep the default most-recent-first behavior). It's hand-maintained (not regenerated by the fetch script) — edit it directly and commit.
activity.html lists, per package, how many commits sit on the branch its last release was actually cut from, since that release — a quick way to spot packages that are overdue a release. Releases aren't always cut from the repo's current default branch: a package might default to an LTS branch (e.g. v17/main) while its latest tagged release shipped from a newer one (e.g. v18.0.1 off v18/main) — comparing against the wrong branch would produce a meaningless count once the two have diverged. So for each package the fetch script:
- Fetches the most recent GitHub release (if any) and the repo's branches.
- Finds which branch that release's tag actually sits on — the branch where the tag is a direct ancestor, picking the closest one (fewest commits ahead) if more than one qualifies.
- Uses that branch (not necessarily the repo's
default_branch) to get the commit count and last commit date.
The site flags a package with "on <branch>" next to its release when that release branch differs from the repo's current default, so it's clear at a glance when the two disagree. Packages whose repo has no GitHub release at all (no auto-release/tagging configured) are called out separately as "no tagged releases" instead of a commit count, since there's no tag to measure from.
Release notes for private repos are fetched using a GitHub token and shown publicly on the site (repo code itself stays private — only release metadata/notes are surfaced).
Setup:
- Create a fine-grained GitHub PAT scoped to
Contents: readon the private repos listed indata/packages.json. - Add it as a repository secret named
RELEASES_GH_TOKEN(Settings → Secrets and variables → Actions).
npm install
# Fetch latest release data (requires a GH token env var for private repos)
GH_TOKEN=ghp_xxx npm run fetch
# Serve the site locally at http://localhost:4173
npm run dev- Repo Settings → Pages → Source:
mainbranch,/docsfolder. docs/CNAMEalready containsreleases.jumoo.co.uk— add a DNSCNAMErecord at your DNS provider pointingreleases.jumoo.co.ukto the org'sgithub.ioPages domain.