{"id":45480527,"url":"https://github.com/sportclimbing/ifsc-calendar","last_synced_at":"2026-05-23T21:00:54.903Z","repository":{"id":154401558,"uuid":"631413896","full_name":"sportclimbing/ifsc-calendar","owner":"sportclimbing","description":"IFSC Climbing iCal Calendar Builder","archived":false,"fork":false,"pushed_at":"2026-05-13T07:52:37.000Z","size":4211,"stargazers_count":43,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-13T09:39:17.847Z","etag":null,"topics":["calendar","calendars","climbing","competition","ical","icalendar","ics","ifsc","rockclimbing","scraper","streaming"],"latest_commit_sha":null,"homepage":"https://ifsc.stream/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sportclimbing.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"sportclimbing","buy_me_a_coffee":"sportclimbing"}},"created_at":"2023-04-23T00:19:02.000Z","updated_at":"2026-05-12T04:10:27.000Z","dependencies_parsed_at":"2023-10-22T11:24:14.761Z","dependency_job_id":"467ad580-d293-4a25-84f5-bc9db886cb42","html_url":"https://github.com/sportclimbing/ifsc-calendar","commit_stats":null,"previous_names":[],"tags_count":742,"template":false,"template_full_name":null,"purl":"pkg:github/sportclimbing/ifsc-calendar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sportclimbing%2Fifsc-calendar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sportclimbing%2Fifsc-calendar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sportclimbing%2Fifsc-calendar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sportclimbing%2Fifsc-calendar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sportclimbing","download_url":"https://codeload.github.com/sportclimbing/ifsc-calendar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sportclimbing%2Fifsc-calendar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33412082,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T18:09:33.147Z","status":"ssl_error","status_checked_at":"2026-05-23T18:09:31.380Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["calendar","calendars","climbing","competition","ical","icalendar","ics","ifsc","rockclimbing","scraper","streaming"],"created_at":"2026-02-22T16:18:52.899Z","updated_at":"2026-05-23T21:00:54.867Z","avatar_url":"https://github.com/sportclimbing.png","language":"PHP","funding_links":["https://github.com/sponsors/sportclimbing","https://buymeacoffee.com/sportclimbing"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n   \u003ch1\u003eWorld Climbing Calendar and Live-Streams for 2026\u003c/h1\u003e\n   \u003cimg src=\"resources/images/logo.png\" alt=\"ifsc logo\" width=\"50%\" /\u003e\n\n\u003cbr /\u003e\u003cbr /\u003e\n\u003cimg src=\"https://img.shields.io/github/downloads/sportclimbing/ifsc-calendar/total?color=green\u0026label=Downloads\" alt=\"downloads\" /\u003e\n\u003cimg src=\"https://scrutinizer-ci.com/g/sportclimbing/ifsc-calendar/badges/quality-score.png?b=main\" alt=\"scrutinizer\" /\u003e\n\u003cimg src=\"https://github.com/sportclimbing/ifsc-calendar/actions/workflows/update-calendar.yml/badge.svg\" alt=\"update\" /\u003e\n\u003cimg src=\"https://github.com/sportclimbing/ifsc-calendar/actions/workflows/push-docker-image.yml/badge.svg\" alt=\"build\" /\u003e\n\u003c/div\u003e\n\n\u003chr /\u003e\n\n- [Web version](#-web-version)\n- [Intro](#-intro)\n- [Usage](#-usage)\n    - [Docker](#docker)\n    - [Local](#build-app-locally-without-docker)\n- [Todo](#-todo)\n- [Features](#-features)\n- [Requirements](#requirements)\n\n## 📖 TL;DR\nThis automatically generates an up-to-date calendar you can subscribe to using your favorite calendar app,\nto never miss an IFSC climbing event ever again. Currently supported formats are `.ics` (iCal) and `json`.\n\n#### How?\nCopy and paste this calendar URL \u003ccode\u003e**https://calendar.ifsc.stream**\u003c/code\u003e into your calendar subscriptions, and it will\nautomatically sync with your device. This works on iPhone, Google Calendar, Proton Calendar, etc... This should keep\nyou updated on future seasons as well.\n\nTake a look at the **[setup guides](https://github.com/sportclimbing/ifsc-calendar/wiki)** for help.\n\n## 🖥️ Web Version\n\nAdditionally, the calendar data is exported as `JSON` and can be viewed on this automatically updated\nwebsite:\n\n\u003cdiv align=\"center\"\u003e\n    \u003ch3\u003e👉 \u003ca href=\"https://ifsc.stream\"\u003ehttps://ifsc.stream\u003c/a\u003e\u003c/h3\u003e\n    (From there you can also subscribe to the calendar with just a few clicks!)\n\u003c/div\u003e\n\n## 👋 Intro\nIf you're constantly missing IFSC events because of a lacking calendar, or timezone confusions,\nthen you're at the right place.\n\nThis command line tool uses IFSC's APIs, plus some scraping (because the available APIs don't provide precise schedules)\nto generate an always up-to-date calendar with all necessary info.\n\n## ⭐️ Features\n\n- Updates automatically every hour\n- Fetches schedules directly from IFSC's website (using some APIs and fancy scraping)\n- Converts times to your local timezone\n- Alerts an hour before events start\n- Fetches stream URLs (and searches YouTube for missing ones)\n- Works for future seasons once dates are published (may require some tweaks)\n- Fetches start list for events\n- Works on any calendar (not just Google)\n- Fully open source\n\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"resources/images/calendar.png\" alt=\"calendar\" /\u003e\n\u003c/div\u003e\n\n## 🛠 Usage\n\n#### Docker\n\nUsing the pre-built Docker image\n```shell\n$ docker run -it --volume \"$PWD:/calendar\" \\\n    ghcr.io/sportclimbing/ifsc-calendar:latest \\ \n    --with-schedule \"/calendar/events-with-schedule.json\" \\\n    --season 2026 \\\n    --output \"/calendar/ifsc-calendar.ics\"\n```\n\n\u003e [!NOTE]\n\u003e All Docker images can be found on\n\u003e - [ghcr.io](https://github.com/sportclimbing/ifsc-calendar/pkgs/container/ifsc-calendar)\n\u003e - [Docker Hub](https://hub.docker.com/u/sportclimbing)\n\n\u003chr /\u003e\n\n#### Build Docker image locally\n\nBuild Docker image\n```shell\n$ docker build --tag ifsc-calendar .\n```\nGenerate `.ics` calendar file\n```shell\n$ docker run -it --volume \"$PWD:/calendar\" ifsc-calendar \\\n    --with-schedule \"/calendar/events-with-schedule.json\" \\\n    --season 2026 \\\n    --output \"/calendar/ifsc-calendar.ics\"\n```\n\nGenerate `.json` calendar file\n```shell\n$ docker run -it --volume \"$PWD:/calendar\" ifsc-calendar \\\n    --with-schedule \"/calendar/events-with-schedule.json\" \\\n    --season 2026 \\\n    --output \"/calendar/ifsc-calendar.json\" \\\n    --format json\n```\n\nExport multiple formats\n```shell\n$ docker run -it --volume \"$PWD:/calendar\" ifsc-calendar \\\n    --with-schedule \"/calendar/events-with-schedule.json\" \\\n    --season 2026 \\\n    --output \"/calendar/ifsc-calendar.json\" \\\n    --format json,ics\n```\n\n\u003chr /\u003e\n\n#### Build app locally (without Docker)\nBuild executable\n```shell\n$ make\n```\n\nGenerate `.ics` calendar file using the generated `.phar`\n```shell\n$ ./build/ifsc-calendar.phar \\\n  --with-schedule \"events-with-schedule.json\" \\\n  --season 2026 \\\n  --output \"ifsc-calendar.ics\"\n```\n\n## 🔧 Todo\n- [ ] Use Symfony serializer to build response object from IFSC API\n- [ ] Calculate average event duration (based on past events)\n- [ ] Add proper start lists to rounds\n- [ ] Add tickets URL?\n- [ ] Finish writing calendar setup guides\n- [ ] Cleanup PHP code\n- [ ] Add more tests\n- [x] Make scraping more robust and fail on errors or missing data\n- [x] Add more domain events to improve output log\n- [x] Add automated tests to PRs (unit tests, coverage, etc)\n- [x] Push Docker image to Docker Hub\n- [x] Add BuyMeACoffee link to `.ics` calendar events\n- [x] Show activity and warnings in console (domain events)\n- [x] Validate newly generated calendar before publishing site\n- [x] Search all YouTube API results (not only the first 50 results)\n- [x] Check if there's an API to fetch events from instead of relying on scraping\n- [x] Find a way to integrate events not posted on the official event page (e.g. Bern)\n- [x] Disable youtube-fetch by default\n- [x] Add links to specific events to calendar\n- [x] Add `latest` tag to latest release\n- [x] Always serve asset from latest release on calendar URL\n- [x] Fetch stream links from YouTube API if none can be scraped\n- [x] Automatically regenerate calendar and update release\n- [ ] ~~Fix scraper for older seasons (formatting changes drastically)~~\n\n## Requirements\n- PHP 8.5\n- ext-dom\n- ext-libxml\n\n## Legal note\nThis is in no way affiliated with or endorsed by the IFSC.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsportclimbing%2Fifsc-calendar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsportclimbing%2Fifsc-calendar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsportclimbing%2Fifsc-calendar/lists"}