Skip to content

Add a calendar for open community calls.#222

Merged
tombentley merged 15 commits into
kroxylicious:mainfrom
tombentley:community-call
Mar 3, 2026
Merged

Add a calendar for open community calls.#222
tombentley merged 15 commits into
kroxylicious:mainfrom
tombentley:community-call

Conversation

@tombentley
Copy link
Copy Markdown
Member

We're going to try using Jitsi since it seemed to
offer the best combination of features:

  • no time limit
  • ability to record meetings + publish on youtube.

The .ics file is hand-crafted, but validated
using https://icalendar.org/validator.html and also checked in Google calendar.

Using the webcal: pseudo-protocol for the link on the page should mean the browser passes the URL to the calendar app to be subscribed-to there.
That should cause the calendar app to regularly
poll for updates, in case we decide to cancel/reschedule meetings. I thought that was preferable to the user downloading a .ics and importing and then us making changes to the schedule making the imported event
series stale.

Putting these two together means we should have the liberty to cancel (using EXDATE:) and reschedule events if we need to. Note that I've already excluded
New Years Eve 2026 using EXDATE:.

We're going to try using Jitsi since it seemed to
offer the best combination of features:
* no time limit
* ability to record meetings + publish on youtube.

The `.ics` file is hand-crafted, but validated
using https://icalendar.org/validator.html and also
checked in Google calendar.

Using the `webcal:` pseudo-protocol for the link on
the page should mean the browser passes the URL to
the calendar app to be subscribed-to there.
That should cause the calendar app to regularly
poll for updates, in case we decide to cancel/reschedule
meetings. I thought that was preferable to the user
downloading a `.ics` and importing and then us making
changes to the schedule making the imported event
series stale.

Putting these two together means we should have the liberty
to cancel (using `EXDATE:`) and reschedule events if we
need to. Note that I've already excluded
New Years Eve 2026  using `EXDATE:`.

Signed-off-by: Tom Bentley <tbentley@redhat.com>
@tombentley tombentley requested a review from a team as a code owner March 2, 2026 23:26
@@ -0,0 +1,41 @@
BEGIN:VCALENDAR
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ics format lacks support for comments :-(

X-WR-CALNAME:Kroxylicious Community Call
X-WR-TIMEZONE:UTC
BEGIN:VEVENT
UID:morning-series@kroxylicious.io
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm using UK-centric notions of morning and eventing, since those are compatible with the meetings being in UTC.

DTSTAMP:20260326T100000Z
DTSTART:20260326T080000Z
DTEND:20260326T084500Z
RRULE:FREQ=WEEKLY;INTERVAL=4;BYDAY=TH
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both the events in the calendar repeat every 4 weeks. You have to include the BYDAY thing to get the recurrance on the right day of the week (it doesn't just figure it out from working forwards from the DTSTAMP). I realised that the notion of day is problematic because of the timezones we work in. The schedule means that the meets are always on a NZ Thursday, but that means half of them are a UK Wednesday.

DTSTART:20260326T080000Z
DTEND:20260326T084500Z
RRULE:FREQ=WEEKLY;INTERVAL=4;BYDAY=TH
EXDATE:20261231T080000Z
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This shows how we can exclude some events from the series.

DESCRIPTION:This is the UK morning slot of our bi-weekly rotation.\n
Click to join:
https://meet.jit.si/moderated/87697d32deaa8cbd8b3b96e1
bbb8aef920c240112935c2d4742c3b1b38a34588 \n
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Physical lines need to be <72 chars. A logical line can be split over multiple physical lines, and I think WS at the start of a physical line is ignored.

Comment on lines +20 to +21
URL:https://meet.jit.si/moderated/87697d32deaa8cbd8b3b96e1
bbb8aef920c240112935c2d4742c3b1b38a34588
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Splitting the URL is a bit 🤮 , but doing so gets rid of a warning from the validator.

Comment thread join-us/index.md Outdated
Comment thread join-us/index.md Outdated
</p>
</div>
<div class="card-footer text-center">
<a href="webcal://kroxylicious.io/join-us/community-call.ics" class="btn btn-primary">Subscribe in my calendar</a>
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note the webcal: protocol. I've not actually tested this bit yet.

Signed-off-by: Tom Bentley <tbentley@redhat.com>
@tombentley
Copy link
Copy Markdown
Member Author

Pushed a 2nd commit which:

  • reorders the cards on the 'join us' page and adds one for the youtube channel
  • puts all the community call info on a single page, because there was a bit too much to say for the card on the join us page
  • on the separate page I show the upcoming events using a js library.
image

Comment thread join-us/index.md
Signed-off-by: Tom Bentley <tbentley@redhat.com>
Copy link
Copy Markdown
Member

@SamBarker SamBarker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

trying to subscribe locally (webcal://localhost:4000/join-us/community-call.ics) fails jekyll logs

[2026-03-03 17:16:39] ERROR bad Request-Line '\x16\x03\x01\x05�\x01\x00\x05�\x03\x03���o�'�¬s���\b\vYT�3YN��S�R�\x10�\x17� 6Z\x12�0'�]k��hJyV�\x02-�\x12�Ώ���+t�aq\x00*JJ\x13\x02\x13\x03\x13\x01�,�+̩�0�/̨�'.
[2026-03-03 17:16:39] ERROR bad Request-Line '\x16\x03\x01\x05�\x01\x00\x05�\x03\x03&��5�Fo���\x0F\v/�wĉ\\Զ/b\e&�jF\ev\x7F ��QY\t�\\�\x19�����&\x02�\x19r�y�>6�[���\x00,ZZ\x13\x02\x13\x03\x13\x01�,�+̩�0�/̨�'.
[2026-03-03 17:16:39] ERROR bad Request-Line '\x16\x03\x01\x00�\x01\x00\x00�\x03\x01'.

Comment thread join-us/community-call/index.md Outdated
Comment thread join-us/community-call/index.md Outdated
Signed-off-by: Tom Bentley <tbentley@redhat.com>
@tombentley
Copy link
Copy Markdown
Member Author

trying to subscribe locally (webcal://localhost:4000/join-us/community-call.ics) fails jekyll logs

Doh, I had the wrong URL after factoring it out to a separate page. Can you pull and try again? (you can set hostname: localhost:4000 in the _config.yml).

Signed-off-by: Tom Bentley <tbentley@redhat.com>
@tombentley
Copy link
Copy Markdown
Member Author

tombentley commented Mar 3, 2026

trying to subscribe locally (webcal://localhost:4000/join-us/community-call.ics) fails jekyll logs

Doh, I had the wrong URL after factoring it out to a separate page. Can you pull and try again? (you can set hostname: localhost:4000 in the _config.yml).

After making this change local testing revealed that I don't have an application locally installed for this text/calendar content type. But that suggests that Chromium knows what to do with it.

Signed-off-by: Tom Bentley <tbentley@redhat.com>
Signed-off-by: Tom Bentley <tbentley@redhat.com>
@tombentley
Copy link
Copy Markdown
Member Author

image

Signed-off-by: Tom Bentley <tbentley@redhat.com>
Signed-off-by: Tom Bentley <tbentley@redhat.com>
Copy link
Copy Markdown
Member

@SamBarker SamBarker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I hit localhost:4000/join-us/community-call/community-call.ics using curl I get the file ics file as I expect however if I try and subscribe via the mac calendar app I see

[2026-03-04 09:08:10] ERROR bad Request-Line '\x16\x03\x01\x05�\x01\x00\x05�\x03\x03&E/t\x15~�I\x1E����\\�/;��o\x16vI�`D�\aH +��\x0F��6���9(�o\x04q�uU��\x15\x0F\x02��'.
[2026-03-04 09:08:10] ERROR bad Request-Line '\x16\x03\x01\x05�\x01\x00\x05�\x03\x03T�ib��D�e\x17�A�Xx�+?|�Q_\x10��\tV%\x19(� &Z#�(��ŀ\x15��*�ZD���<�y�e\x10M�`�t�\x00,jj\x13\x02\x13\x03\x13\x01�,�+̩�0�/̨�'.
[2026-03-04 09:08:10] ERROR bad Request-Line '\x16\x03\x01\x00�\x01\x00\x00�\x03\x01u�YO����)�5\x7F:\b+'\x13l�Db�\x7F�e)�4\t\x10�\x00\x00\x14�'.

I'll try and debug further.

Comment thread join-us/community-call/community-call.ics Outdated
@tombentley
Copy link
Copy Markdown
Member Author

If I hit localhost:4000/join-us/community-call/community-call.ics using curl I get the file ics file as I expect however if I try and subscribe via the mac calendar app I see

[2026-03-04 09:08:10] ERROR bad Request-Line '\x16\x03\x01\x05�\x01\x00\x05�\x03\x03&E/t\x15~�I\x1E����\\�/;��o\x16vI�`D�\aH +��\x0F��6���9(�o\x04q�uU��\x15\x0F\x02��'.
[2026-03-04 09:08:10] ERROR bad Request-Line '\x16\x03\x01\x05�\x01\x00\x05�\x03\x03T�ib��D�e\x17�A�Xx�+?|�Q_\x10��\tV%\x19(� &Z#�(��ŀ\x15��*�ZD���<�y�e\x10M�`�t�\x00,jj\x13\x02\x13\x03\x13\x01�,�+̩�0�/̨�'.
[2026-03-04 09:08:10] ERROR bad Request-Line '\x16\x03\x01\x00�\x01\x00\x00�\x03\x01u�YO����)�5\x7F:\b+'\x13l�Db�\x7F�e)�4\t\x10�\x00\x00\x14�'.

I'll try and debug further.

The way I believe it's supposed to work is:

  • the button link uses webcal:.
  • the browser is supposed to know to pass the http:-ified URL to the calendar app.
  • the calendar app GETs the ics (and polls for updates).

I think you're posting the webserver logs above? And it seems to be receiving a weird non-HTTP request. But what's the client/UserAgent (do we know for sure that it's iCalendar) and what's the method it's using.

Can you try without the splitting of the URL logical lines in the .ics?

Signed-off-by: Tom Bentley <tbentley@redhat.com>
Copy link
Copy Markdown
Member

@robobario robobario left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, I deployed it to my fork with the change I've suggested

https://robobario.github.io/kroxylicious.github.io/join-us/community-call/

you can see the subscribe link is webcal://robobario.github.io/kroxylicious.github.io/join-us/community-call/community-call.ics

and I imported that into GCal by clicking subscribe in chrome, the calendar is named correctly and looks good

Image

Comment thread join-us/community-call/index.md Outdated
Co-authored-by: Robert Young <robertyoungnz@gmail.com>
Signed-off-by: Tom Bentley <tombentley@users.noreply.github.com>
@robobario
Copy link
Copy Markdown
Member

ah I can see a bi-weekly in the calendar, where I thought you'd picked Fortnightly earlier?

Comment thread _config.yml Outdated
Signed-off-by: Tom Bentley <tbentley@redhat.com>
@tombentley
Copy link
Copy Markdown
Member Author

@robobario I think I

ah I can see a bi-weekly in the calendar, where I thought you'd picked Fortnightly earlier?

Fixed already I believe.

Copy link
Copy Markdown
Member

@SamBarker SamBarker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way I believe it's supposed to work is:

  • the button link uses webcal:.
  • the browser is supposed to know to pass the http:-ified URL to the calendar app.
  • the calendar app GETs the ics (and polls for updates).

I think you're posting the webserver logs above? And it seems to be receiving a weird non-HTTP request. But what's the client/UserAgent (do we know for sure that it's iCalendar) and what's the method it's using.

Can you try without the splitting of the URL logical lines in the .ics?

So if I change the subscribe URL in the calendar from webcal to http it subscribes correctly but the log lies still appear. I Haven't figured out what the Mac OS calendar is doing but things look good

@tombentley
Copy link
Copy Markdown
Member Author

@SamBarker

So if I change the subscribe URL in the calendar from webcal to http it subscribes correctly but the log lies still appear. I Haven't figured out what the Mac OS calendar is doing but things look good

I think that would mean the browser does the GET, sees the ContentType response header and passes off the content to the calendar app. Thus it would be a download, rather than a subscribe. My mental model could be wrong (I don't have a mac, so I have little idea how the Mac OS Calendar works). But I think the problem with download is that if we subsequently change the ics (e.g. to cancel a meeting) then it won't get updated in the calendar. I'd like to avoid that if possible.

@tombentley
Copy link
Copy Markdown
Member Author

I managed to import the calendar into Outlook (the web version), though by pasting the webcal: link into Add calendar > Subscribe from web rather than by clicking on the button (because the Fedora doesn't have any native applications for ical).

@SamBarker
Copy link
Copy Markdown
Member

@SamBarker

So if I change the subscribe URL in the calendar from webcal to http it subscribes correctly but the log lies still appear. I Haven't figured out what the Mac OS calendar is doing but things look good

I think that would mean the browser does the GET, sees the ContentType response header and passes off the content to the calendar app. Thus it would be a download, rather than a subscribe. My mental model could be wrong (I don't have a mac, so I have little idea how the Mac OS Calendar works). But I think the problem with download is that if we subsequently change the ics (e.g. to cancel a meeting) then it won't get updated in the calendar. I'd like to avoid that if possible.

I maybe wasn't clear the change in subscribe URL was within the calendar app. It seemed it understands that it is a subscription rather than a one off download, but doesn't understand how to resolve webcal as a protocol. If I tell it its http instead of webcal it starts a subscription and imports the events correctly.

Signed-off-by: Tom Bentley <tbentley@redhat.com>
@tombentley
Copy link
Copy Markdown
Member Author

I've had second thoughts about the UX. My own inability to test this (given I don't have a native calendar application) led me to quiz Gemini about the usability of this for all visitors to the site. It's suggested a different approach which doesn't rely the combination of browser + calendar handler, but puts the onus on the user to choose the approach which works for them.

image

@robobario
Copy link
Copy Markdown
Member

I'm freshening up my fork now, would be interested to see if you can subscribe to one over the public internet as opposed to localhost @SamBarker

tombentley and others added 2 commits March 4, 2026 11:04
Signed-off-by: Tom Bentley <tbentley@redhat.com>
@tombentley tombentley merged commit 9454ebb into kroxylicious:main Mar 3, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants