Frontend for ifsc.stream, built as a static Astro site.
It renders World Climbing season/event data generated by sportclimbing/ifsc-calendar and deploys static output to GitHub Pages.
- Astro pages/components live in
src/, static output is generated indist/. - Browser app code lives in
src/js/app/and is bundled intopublic/js/app.js.
Pages:
| URL | Description |
|---|---|
/ |
Current season calendar |
/season/:season/ |
Past season calendar |
/season/:season/event/:eventSlugAndId/ |
Individual event page |
/archive/ |
All historical seasons |
/faq/ |
FAQ |
/privacy-policy/ |
Privacy policy |
/start-list-modals/:season/:eventId.html |
Start-list modal fragments |
/modals/filters.html, /modals/sync.html |
Filter/sync modal fragments |
- Install dependencies:
npm install --no-package-lock - Start dev server:
npm run dev - Build site:
npm run build - Preview build:
npm run preview - Rebuild JS only:
npm run build:js(ornpm run build:js:min) - Rebuild Tailwind CSS:
npm run build:tailwind - Rebuild modals CSS:
npm run build:modals-css(ornpm run build:modals-css:min)
After editing any file under src/js/app/, regenerate the bundle with npm run build:js.
- Season source data:
events/events_YYYY.json - Structured data:
node bin/build-structured-data.mjs [--minify] - Sitemap:
node bin/build-sitemap.mjs - Material Symbols font subset:
python3 bin/subset-material-symbols.py - Athlete photo cache/resize:
node bin/cache-athlete-photos.mjs - YouTube thumbnail cache/resize:
node bin/cache-youtube-thumbnails.mjs
Playwright integration tests live in tests/integration.
make testauto-selects Docker when available (recommended).make test-localruns on host machine.make test-dockerforces Playwright Docker image.
Workflow: .github/workflows/static-deploy.yml
- Triggered on
mainpushes, hourly schedule, and manual dispatch. - Rebuilds Tailwind CSS, JS bundle, structured data, and sitemap fresh on every deploy.
- Asset version set from commit SHA for cache-busting.
- Deploys
dist/to GitHub Pages.
- Clean up JS (especially in
.astrofiles) - Add light mode
- Fix real athlete count in Archive Page
- Rebuild previous event JSON file
- Verify streams show correctly when live
- Add browser notifications
- Improve breadcrumb navigation
- Add privacy policy
- Download, resize, and serve YouTube thumbnails from GH pages
- Fix links to events in
.icscalendar