Personal project, Since August 2026
Hockey Libre Genève
Open hockey schedules for Geneva’s ice rinks, gathered on one bilingual site. Each rink has its own calendar you can add to Apple, Google or Outlook, and it updates itself every week.
Details
- Role
- Concept, design and development
- Status
- Live
- Languages
- French and English

Context
10 rinks, 10 websites to check.
In Geneva, each rink publishes its open hockey schedule its own way: a web page, a PDF bulletin, a flyer. To know where to skate on a Saturday, you had to open ten websites, some of them still showing last season.
I play open hockey myself. I wanted a single page to check, and above all a calendar you never need to check again.
How it works
- SourcesWeb pages and PDF bulletins published by the rinks.
- ScrapersWritten in Python, run every week by GitHub Actions.
- Pull requestChanges arrive in a pull request.
- Site and calendarsThe Astro site and one .ics file per rink, plus a combined one.
- Calendar appApple, Google or Outlook update on their own.
A subscription, not a page to revisit
The calendar is the main channel. You subscribe once, and added or cancelled sessions show up in your calendar on their own.
When a scraper fails, it keeps the last known state and emails me the error.
# vernets.ics
BEGIN:VEVENT
SUMMARY:Hockey libre - Vernets
DTSTART;TZID=Europe/Zurich:20261004T110000
DTEND;TZID=Europe/Zurich:20261004T120000
END:VEVENT
Choices
A cancellation stays visible
A session cancelled after it was published stays in the calendar, markedSTATUS:CANCELLED. It never disappears silently.Nothing uncertain shown as certain
If a source stops responding, the site keeps the last known data and flags it for review, rather than inventing or deleting anything.No headless browser, no OCR
A deliberate choice: scrapers that are simple to maintain, and manual entry when a source doesn’t lend itself to scraping.
In pictures
The account posts on its own: a story every day with a session, the opening and closing of each rink, and a summary of the next 7 days every Tuesday. The visuals are HTML templates rendered as images, then posted on schedule by a Cloudflare Worker. Instagram

Launch post 
The real problem 
A rink opening
Videos
An Instagram reel explaining the calendar subscription in four steps.
Technologies
- Astro
- Static bilingual site, in French and English.
- Python
- Scrapers, calendar and Instagram visual generation.
- GitHub Actions
- Weekly scrape, pull request and email alerts.
- Cloudflare Pages & Workers
- Hosting and scheduled posts.
- iCalendar
- One .ics subscription per rink, plus a combined calendar.