The central registry for Subway Builder community mods and custom maps.
Warning
Work in Progress - The Railyard is still under active development. Expect changes to the submission process, schema, and tooling.
All submissions are handled through GitHub Issues. Pick a template to get started:
The Railyard stores metadata only - manifests, gallery images, and pointers to where your mod or map is actually hosted (GitHub Releases, CDNs, etc.). When you submit through an issue template, CI validates your submission and opens a PR automatically. Once merged, your listing goes live.
publish-map.yml and update-map.yml are generated from a shared script:
- Generate both templates:
pnpm --dir scripts run generate:map-templates
- Verify templates are up to date:
pnpm --dir scripts run check:map-templates
Download and release-integrity snapshots are generated into:
maps/downloads.jsonmods/downloads.jsonmaps/integrity.jsonmods/integrity.json
Local commands:
- Generate full registry analytics (downloads + integrity):
pnpm --dir scripts run generate-registry-analytics
- Generate maps only:
pnpm --dir scripts run generate-registry-analytics:maps
- Generate mods only:
pnpm --dir scripts run generate-registry-analytics:mods
- Generate maps only (download-only mode):
pnpm --dir scripts run generate-downloads:maps:download-only
- Generate mods only (download-only mode):
pnpm --dir scripts run generate-downloads:mods:download-only
- Generate map demand stats only:
pnpm --dir scripts run generate-registry-demand-stats
Integrity behavior:
- Only semver versions (
vX.Y.ZorX.Y.Z) are eligible for download counting. - Versions that fail integrity checks are excluded from
downloads.json. - Non-semver versions are still recorded in
integrity.jsonas incomplete.
Automation:
regenerate-downloads-hourly.ymlruns hourly in download-only mode (updates downloads only; no ZIP integrity pass).regenerate-registry-analytics.ymlruns every 8 hours in full mode (refreshes downloads + integrity + integrity cache, and map demand stats).- Full mode posts two Discord summaries (downloads/integrity and map demand stats) to the same webhook secret:
DISCORD_WEBHOOK_URL.
Daily combined download snapshots are cached under:
history/snapshot_YYYY_MM_DD.json
Each snapshot includes:
mapsandmodssections- embedded current
downloadsandindexpayloads total_downloadsnet_downloadsversus the previous snapshot (or total on first snapshot)entriescount from the correspondingindex.json
Local command:
- Generate/update today’s history snapshot:
pnpm --dir scripts run generate-download-history
Automation:
cache-download-history.ymlruns daily (and on manual dispatch), commitshistory/snapshot_YYYY_MM_DD.json, and posts summary stats to Discord.
Map manifests now support auto-derived demand metrics from map ZIPs:
population(auto-derived from residents total, kept for backwards compatibility)residents_totalpoints_countpopulation_count
Local command:
- Generate/refresh map demand stats:
pnpm --dir scripts run generate-registry-demand-stats- (alias)
pnpm --dir scripts run generate-map-demand-stats - Force refresh all maps (ignore SHA/cache skip):
pnpm --dir scripts run generate-registry-demand-stats -- --force
- Refresh one map by id:
pnpm --dir scripts run generate-registry-demand-stats -- --id <map-id>
For technical details, see ARCHITECTURE.md.