https://github.com/sportclimbing/ifsc-calendar
IFSC Climbing iCal Calendar Builder
https://github.com/sportclimbing/ifsc-calendar
calendar calendars climbing competition ical icalendar ics ifsc rockclimbing scraper streaming
Last synced: 23 days ago
JSON representation
IFSC Climbing iCal Calendar Builder
- Host: GitHub
- URL: https://github.com/sportclimbing/ifsc-calendar
- Owner: sportclimbing
- License: mit
- Created: 2023-04-23T00:19:02.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2026-05-13T07:52:37.000Z (about 1 month ago)
- Last Synced: 2026-05-13T09:39:17.847Z (about 1 month ago)
- Topics: calendar, calendars, climbing, competition, ical, icalendar, ics, ifsc, rockclimbing, scraper, streaming
- Language: PHP
- Homepage: https://ifsc.stream/
- Size: 4.02 MB
- Stars: 43
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE.md
Awesome Lists containing this project
README
World Climbing Calendar and Live-Streams for 2026
- [Web version](#-web-version)
- [Intro](#-intro)
- [Usage](#-usage)
- [Docker](#docker)
- [Local](#build-app-locally-without-docker)
- [Todo](#-todo)
- [Features](#-features)
- [Requirements](#requirements)
## 📖 TL;DR
This automatically generates an up-to-date calendar you can subscribe to using your favorite calendar app,
to never miss an IFSC climbing event ever again. Currently supported formats are `.ics` (iCal) and `json`.
#### How?
Copy and paste this calendar URL **https://calendar.ifsc.stream** into your calendar subscriptions, and it will
automatically sync with your device. This works on iPhone, Google Calendar, Proton Calendar, etc... This should keep
you updated on future seasons as well.
Take a look at the **[setup guides](https://github.com/sportclimbing/ifsc-calendar/wiki)** for help.
## 🖥️ Web Version
Additionally, the calendar data is exported as `JSON` and can be viewed on this automatically updated
website:
## 👋 Intro
If you're constantly missing IFSC events because of a lacking calendar, or timezone confusions,
then you're at the right place.
This command line tool uses IFSC's APIs, plus some scraping (because the available APIs don't provide precise schedules)
to generate an always up-to-date calendar with all necessary info.
## ⭐️ Features
- Updates automatically every hour
- Fetches schedules directly from IFSC's website (using some APIs and fancy scraping)
- Converts times to your local timezone
- Alerts an hour before events start
- Fetches stream URLs (and searches YouTube for missing ones)
- Works for future seasons once dates are published (may require some tweaks)
- Fetches start list for events
- Works on any calendar (not just Google)
- Fully open source
## 🛠 Usage
#### Docker
Using the pre-built Docker image
```shell
$ docker run -it --volume "$PWD:/calendar" \
ghcr.io/sportclimbing/ifsc-calendar:latest \
--with-schedule "/calendar/events-with-schedule.json" \
--season 2026 \
--output "/calendar/ifsc-calendar.ics"
```
> [!NOTE]
> All Docker images can be found on
> - [ghcr.io](https://github.com/sportclimbing/ifsc-calendar/pkgs/container/ifsc-calendar)
> - [Docker Hub](https://hub.docker.com/u/sportclimbing)
#### Build Docker image locally
Build Docker image
```shell
$ docker build --tag ifsc-calendar .
```
Generate `.ics` calendar file
```shell
$ docker run -it --volume "$PWD:/calendar" ifsc-calendar \
--with-schedule "/calendar/events-with-schedule.json" \
--season 2026 \
--output "/calendar/ifsc-calendar.ics"
```
Generate `.json` calendar file
```shell
$ docker run -it --volume "$PWD:/calendar" ifsc-calendar \
--with-schedule "/calendar/events-with-schedule.json" \
--season 2026 \
--output "/calendar/ifsc-calendar.json" \
--format json
```
Export multiple formats
```shell
$ docker run -it --volume "$PWD:/calendar" ifsc-calendar \
--with-schedule "/calendar/events-with-schedule.json" \
--season 2026 \
--output "/calendar/ifsc-calendar.json" \
--format json,ics
```
#### Build app locally (without Docker)
Build executable
```shell
$ make
```
Generate `.ics` calendar file using the generated `.phar`
```shell
$ ./build/ifsc-calendar.phar \
--with-schedule "events-with-schedule.json" \
--season 2026 \
--output "ifsc-calendar.ics"
```
## 🔧 Todo
- [ ] Use Symfony serializer to build response object from IFSC API
- [ ] Calculate average event duration (based on past events)
- [ ] Add proper start lists to rounds
- [ ] Add tickets URL?
- [ ] Finish writing calendar setup guides
- [ ] Cleanup PHP code
- [ ] Add more tests
- [x] Make scraping more robust and fail on errors or missing data
- [x] Add more domain events to improve output log
- [x] Add automated tests to PRs (unit tests, coverage, etc)
- [x] Push Docker image to Docker Hub
- [x] Add BuyMeACoffee link to `.ics` calendar events
- [x] Show activity and warnings in console (domain events)
- [x] Validate newly generated calendar before publishing site
- [x] Search all YouTube API results (not only the first 50 results)
- [x] Check if there's an API to fetch events from instead of relying on scraping
- [x] Find a way to integrate events not posted on the official event page (e.g. Bern)
- [x] Disable youtube-fetch by default
- [x] Add links to specific events to calendar
- [x] Add `latest` tag to latest release
- [x] Always serve asset from latest release on calendar URL
- [x] Fetch stream links from YouTube API if none can be scraped
- [x] Automatically regenerate calendar and update release
- [ ] ~~Fix scraper for older seasons (formatting changes drastically)~~
## Requirements
- PHP 8.5
- ext-dom
- ext-libxml
## Legal note
This is in no way affiliated with or endorsed by the IFSC.