The app is now built around one canonical remote data contract intended for both the browser app and future mobile apps.
Stable URLs:
https://xatpy.github.io/beatable/data/catalog-manifest.json- the entry point clients should check first
https://xatpy.github.io/beatable/data/catalog.json- the latest stable JSON dataset
https://xatpy.github.io/beatable/data/catalogs/catalog-<version>.json- immutable versioned dataset files
The manifest currently includes:
schemaVersionproductversiongeneratedAtdatasetUrlcurrentUrlmanifestUrlsha256sizeBytesmatchedCounttotalCatalogCount
Current manifest example:
{
"schemaVersion": 1,
"product": "Beatable",
"baseUrl": "https://xatpy.github.io/beatable/",
"version": "20260324T085304Z",
"generatedAt": "2026-03-24T08:53:04.405Z",
"datasetUrl": "https://xatpy.github.io/beatable/data/catalogs/catalog-20260324T085304Z.json",
"currentUrl": "https://xatpy.github.io/beatable/data/catalog.json",
"manifestUrl": "https://xatpy.github.io/beatable/data/catalog-manifest.json",
"datasetPath": "data/catalogs/catalog-20260324T085304Z.json"
}The intended client update flow is:
- Load the last good cached dataset immediately if available.
- Fetch
https://xatpy.github.io/beatable/data/catalog-manifest.jsonin the background. - Compare the returned
versionwith the locally stored version metadata. - If unchanged, keep using the current dataset.
- If changed, download
datasetUrlfully, validate it, then swap the local dataset pointer. - Only after the new dataset succeeds should the client stop using the older one.
This keeps the client simple and gives deterministic versioning for mobile, while avoiding direct dependence on the refresh pipeline.
The repo includes a scheduled/manual GitHub Actions workflow at:
.github/workflows/update-data.yml
That workflow:
- installs dependencies
- runs
npm run update-data - commits refreshed
data/artifacts if they changed - pushes them back to the repository
That means mobile apps can pick up refreshed game data through the manifest without requiring a new app store release.