All projects

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
Hockey Libre Genève home page

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

  1. Sources
    Web pages and PDF bulletins published by the rinks.
  2. Scrapers
    Written in Python, run every week by GitHub Actions.
  3. Pull request
    Changes arrive in a pull request.
  4. Site and calendars
    The Astro site and one .ics file per rink, plus a combined one.
  5. Calendar app
    Apple, 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, marked STATUS: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

Instagram

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: 10 rinks, one calendar
    Launch post
  • Post: the real problem, 10 rinks, 10 schedules to check
    The real problem
  • Post: Vernets opening from Sunday 4 October, 11:00–12:00
    A rink opening

Videos

An Instagram reel explaining the calendar subscription in four steps.

How it works · Instagram reel

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.