Skip to content
Merged
41 changes: 41 additions & 0 deletions join-us/community-call/community-call.ics
Original file line number Diff line number Diff line change
@@ -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 :-(

VERSION:2.0
PRODID:-//Kroxylicious Community Call//Event Feed 1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
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.

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.

SUMMARY:Kroxylicious Community Call
DESCRIPTION:An opportunity to talk about Kroxylicious with the people working on it.\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.

URL:https://meet.jit.si/moderated/87697d32deaa8cbd8b3b96e1
bbb8aef920c240112935c2d4742c3b1b38a34588
Comment on lines +20 to +21
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.

LOCATION:https://meet.jit.si/moderated/87697d32deaa8cbd8b3b96e1
bbb8aef920c240112935c2d4742c3b1b38a34588
END:VEVENT
BEGIN:VEVENT
UID:evening-series@kroxylicious.io
DTSTAMP:20260311T100000Z
DTSTART:20260311T200000Z
DTEND:20260311T204500Z
RRULE:FREQ=WEEKLY;INTERVAL=4;BYDAY=WE
SUMMARY:Kroxylicious Community Call
DESCRIPTION:An opportunity to talk about Kroxylicious with the people working on it.\n
Click to join:
https://meet.jit.si/moderated/87697d32deaa8cbd8b3b96e1
bbb8aef920c240112935c2d4742c3b1b38a34588 \n
URL:https://meet.jit.si/moderated/87697d32deaa8cbd8b3b96e1
bbb8aef920c240112935c2d4742c3b1b38a34588
LOCATION:https://meet.jit.si/moderated/87697d32deaa8cbd8b3b96e1
bbb8aef920c240112935c2d4742c3b1b38a34588
END:VEVENT
END:VCALENDAR
115 changes: 115 additions & 0 deletions join-us/community-call/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
---
layout: default
title: Community call
---
<link href='https://cdn.jsdelivr.net/npm/fullcalendar@6.1.10/index.global.min.css' rel='stylesheet' />
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@6.1.10/index.global.min.js'></script>
<script src='https://cdn.jsdelivr.net/npm/ical.js@1.5.0/build/ical.min.js'></script>
<script src='https://cdn.jsdelivr.net/npm/@fullcalendar/icalendar@6.1.10/index.global.min.js'></script>
<script src='https://cdn.jsdelivr.net/npm/@fullcalendar/list@6.1.10/index.global.min.js'></script>
<script src='https://cdn.jsdelivr.net/npm/@fullcalendar/bootstrap5@6.1.10/index.global.min.js'></script>


<div class="row align-items-start justify-content-center my-5">
<div class="col-lg-3 mb-5" role="complementary" aria-labelledby="page-title">
<div class="card shadow px-2 mx-2">
<div class="card-body">
<h1 id="page-title" class="fs-3">{{ page.title }}</h1>
<p>Sometimes it's just easier to talk face-to-face.
We have a virtual meeting every two weeks that's open to anyone to come along.</p>
<p>The time alternates to try to accomodate people from different parts of the world,
so check the next-but-one if the next meeting is in the middle of your night.</p>
</div>
</div>
</div>
<div class="col-lg-6" role="main">
<div>
<p>We're using <a href="https://meet.jit.si/">Jitsi</a>, a free and open source video conferencing service.
You don't need an account to join.</p>
<div class="alert alert-warning" role="alert">
<h4 class="alert-heading">Meetings are public (and recorded!)</h4>
<p>Meetings are recorded and shared on <a href="https://www.youtube.com/@kroxylicious-io">our YouTube channel</a>.</p>
</div>
</div>
<div class="d-flex flex-wrap align-items-center justify-content-between mb-4">
<div>
<h2 class="mb-1">Event Schedule</h2>
<p class="text-muted mb-0">Local time: <strong id="tz-display">Detecting...</strong></p>
</div>
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle d-flex align-items-center" type="button" id="calendarDropdown" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
<i class="bi bi-calendar-plus me-2"></i> Add to Calendar</button>
<ul class="dropdown-menu dropdown-menu-end shadow" aria-labelledby="calendarDropdown" style="min-width: 300px;">
<li><h6 class="dropdown-header">Subscribe via App</h6></li>
<li>
<a class="dropdown-item d-flex align-items-center" href="{{ '/join-us/community-call/community-call.ics' | absolute_url | replace: 'http://', 'webcal://' | replace: 'https://', 'webcal://' }}">
<i class="bi bi-apple me-2 text-dark"></i> Apple Calendar</a>
</li>
<li>
<a class="dropdown-item d-flex align-items-center" href="https://www.google.com/calendar/render?cid={{ '/join-us/community-call/community-call.ics' | absolute_url }}" target="_blank">
<i class="bi bi-google me-2 text-danger"></i> Google Calendar (Web)</a>
</li>
<li>
<a class="dropdown-item d-flex align-items-center" href="{{ '/join-us/community-call/community-call.ics' | absolute_url | replace: 'http://', 'webcal://' | replace: 'https://', 'webcal://' }}">
<i class="bi bi-microsoft me-2 text-dark"></i> Outlook (not Web)</a>
</li>
<li><hr class="dropdown-divider"></li>
<li><h6 class="dropdown-header">Manual Setup</h6></li>
<li class="px-3 py-2">
<label for="calLink" class="form-label small text-muted">Copy Subscription URL:</label>
<div class="input-group input-group-sm">
<input type="text" class="form-control" value="{{ '/join-us/community-call/community-call.ics' | absolute_url }}" id="calLink" readonly>
<button class="btn btn-outline-secondary" type="button" onclick="copyCalLink()" id="copyBtn">
<i class="bi bi-clipboard"></i></button>
</div>
<div class="small">Using Outlook Web? Copy the link above, then in Outlook go to 'Add Calendar' &gt; 'Subscribe from web' and paste the link.</div>
<div id="copyFeedback" class="small text-success mt-1 d-none">Link copied!</div>
</li>
</ul>
</div>
</div>
<div id="calendar" class="border rounded bg-white p-3 shadow-sm"></div>
</div>
</div>
<script>

function copyCalLink() {
const copyText = document.getElementById("calLink");
const btn = document.getElementById("copyBtn");
const feedback = document.getElementById("copyFeedback");

// Copy to clipboard
navigator.clipboard.writeText(copyText.value).then(() => {
// Show feedback
feedback.classList.remove('d-none');
btn.classList.replace('btn-outline-secondary', 'btn-success');

// Reset after 3 seconds
setTimeout(() => {
feedback.classList.add('d-none');
btn.classList.replace('btn-success', 'btn-outline-secondary');
}, 3000);
});
}

// Timezone detection
document.addEventListener('DOMContentLoaded', function() {
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
document.getElementById('tz-display').textContent = tz.replace('_', ' ');
});

// Render the events in the ics on the page
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'listMonth',
// This tells the calendar where to find your "Source of Truth"
events: {
url: 'community-call.ics',
format: 'ics'
},
themeSystem: 'bootstrap5'
});
calendar.render();
});
</script>
25 changes: 15 additions & 10 deletions join-us/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,36 +32,41 @@ title: Join Us!
</div>
<div class="col">
<div class="card shadow mb-2 mx-2 h-100">
<div class="card-header"><h2 class="card-title fs-4">Follow us on Bluesky</h2></div>
<div class="card-header"><h2 class="card-title fs-4">Join our Community Call</h2></div>
<div class="card-body mx-3 my-2">
<p>Follow us on Bluesky, and share your Kroxylicious story.</p>
<p>Sometimes it's just easier to talk face-to-face.
We have a virtual meeting every two weeks that's open to anyone to come along.
</p>
</div>
<div class="card-footer text-center">
<a href="https://bsky.app/profile/kroxylicious.io" class="btn btn-primary">Follow on Bluesky</a>
<a href="community-call/" class="btn btn-primary">More info</a>
</div>
</div>
</div>
<div class="col">
<div class="card shadow mb-2 mx-2 h-100">
<div class="card-header"><h2 class="card-title fs-4">Follow on X</h2></div>
<div class="card-header"><h2 class="card-title fs-4">Follow us on social media</h2></div>
<div class="card-body mx-3 my-2">
<p>Follow us on X, and share your Kroxylicious story.</p>
<p>Follow us on social media, and share your Kroxylicious story.</p>
</div>
<div class="card-footer text-center">
<a href="https://bsky.app/profile/kroxylicious.io" class="btn btn-primary">Follow on Bluesky</a>
<a href="https://x.com/kroxylicious" class="btn btn-primary">Follow on X</a>
</div>
</div>
</div>
<div class="col">
<div class="card shadow mb-2 mx-2 h-100">
<div class="card-header"><h2 class="card-title fs-4">Join our monthly Office Hours</h2></div>
Comment thread
tombentley marked this conversation as resolved.
<div class="card-header"><h2 class="card-title fs-4">Watch on YouTube</h2></div>
<div class="card-body mx-3 my-2">
<p>Sometimes it's just easier to talk face-to-face.
We have a meeting every month that's open to anyone to come along.</p>
<p>The date and time is advertised on the <a href="https://kroxylicious.slack.com/archives/C050RNMQW8G">#general</a> Slack channel.</p>
<p>You can subscribe for demos and highlights of new features in releases.</p>
</div>
<div class="card-footer text-center">
<a href="https://www.youtube.com/@kroxylicious-io" class="btn btn-primary">Our YouTube channel</a>
</div>
</div>
</div>

</div>
</div>
<hr class="section-divider"/>
Expand Down Expand Up @@ -147,4 +152,4 @@ title: Join Us!
</div>
</div>
</div>
</div>
</div>