Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions _data/event-links.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# used for event layout
- key: ICS
- key: calendar-path
icon: calendar-plus
text: events.links.add-calendar
url: /events.ics
url: https://calendar.antennapod.org/
Comment thread
ByteHamster marked this conversation as resolved.
- key: more-information
Comment thread
keunes marked this conversation as resolved.
icon: external-link-square-alt
text: events.links.more-information
url:
- key: meeting-room
icon: headset
text: events.links.open-meeting
url:
url: https://meet.antennapod.org/
- key: blog-post
icon: newspaper
text: events.links.open-blog
Expand All @@ -22,4 +22,4 @@
- key: location
icon: map
text: events.links.open-map
url: https://www.openstreetmap.org/relation/
url: https://www.openstreetmap.org/
16 changes: 0 additions & 16 deletions _data/ics-timezones.yml

This file was deleted.

60 changes: 24 additions & 36 deletions _events/0_A meeting template.md
Original file line number Diff line number Diff line change
@@ -1,49 +1,37 @@
---
title: Awesome get-together on topic X 😎
# Required. Displayed both on the event detail page and in the ICS calendar event.
summary:
# Required. Displayed on the Events overview page.
image:
# Optional. Displayed on Events overview page and the event detail page.
permalink:
# Optional. "/events/:slug" recommended for recurring events, to avoid that the event gets a date-based URL.
uid:
# Required. Don't edit after publishing. Get one here: https://www.random.org/strings/?num=1&len=20&digits=on&upperalpha=on&unique=on&format=html&rnd=new
sequence:
# Optional. Defaults to 0 if left empty. Should be increased with 1 on every big event edit.
timezone:
# Optional. Timezone used for the event. If not specified, UTC will be used. View & add timezones in _data/ics-timezones.yml
datetime-start:
# Required. Format: yyyy-mm-dd hh:mm. To find the meeting time in UTC, use https://www.timeanddate.com/worldclock/converter.html?p1=1440
datetime-end:
# Required. Format: yyyy-mm-dd hh:mm. If recurring, this end time is applied also to all occurrences of the generated recurrence set
# Required. Displayed on the event detail page.
recurring:
# Optional. Can be "yes"
recurrence-text:
# Required if "recurring: yes". Displayed on Events overview page and the event detail page. View & add strings in _i18n/en.yml
recurrence-rule:
# Required if "recurring: yes". iCAL recurrence rule. Create recurrence rule here: https://icalendar.org/rrule-tool.html
# If used, the UNTIL rule part MUST be specified as a date with UTC time.
recurrence-exceptions:
# Optional. List of dates on which the event is not taking place. Put starting dates that match the recurrence pattern. Time of original meeting will be used & cancelled. Format:
# - yyyy-mm-dd
# - yyyy-mm-dd
recurrence-additions:
# List of date-times on which the event is additionally taking place. Format:
# - start: yyyy-mm-dd hh:mm
# end: yyyy-mm-dd hh:mm
# - start: yyyy-mm-dd hh:mm
# end: yyyy-mm-dd hh:mm
datetime-start:
# Required. Format: yyyy-mm-dd hh:mm. To find the meeting time in UTC, use https://www.timeanddate.com/worldclock/converter.html?p1=1440
timezone:
# Optional. Timezone used for the event (e.g. Europe/Brussels). If not specified, UTC will be used. Used to complement the time HTML tag on the event page.
summary:
# Required. Displayed on the Events overview page.
image:
# Optional. Displayed on Events overview page and the event detail page.
location:
# Required. Must be an osm.org relation ID or the text 'online'.
location-label:
# Recommended. Human-readable description of the location (e.g. address) for ICS. If not provided, link to meeting-room or to OSM will be used.
more-information:
# Optional. Must be a URL.
# Required. Must be an osm.org type + ID (e.g. node/13473395006) or the text 'online'.

# Links on the events page:
meeting-room:
# Optional. Must be a URL. Link displayed on event page if "location: online".
more-information:
# Optional. Must be a URL.
blog-post:
# Optional. Must be the path of the blog post, starting with the year (e.g. 2022/10/translation-coordinator).
recording:
# Optional. Must be a URL.

# Calendar links:
calendar-path:
# Required for recurring events. Path under https://calendar.antennapod.org, for example "community-call".
uid:
# Required for one-off events. Davis/Sabre event UID used to build the direct .ics download URL.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can't we just use the same calendar link property for both instead of trying to be smart? That's a lot more explicit

Copy link
Copy Markdown
Member Author

@keunes keunes May 26, 2026

Choose a reason for hiding this comment

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

The logic is:

  • recurring events: we want to encourage people to subscribe to the remote calendar and receive updates (whether they subscribe to all events or just this one)
  • one-off events: if they don't want to subscribe to all our events, we should offer a quick way to add just this one (e.g. FOSDEM) to their calendar.

For this distinction, we need different info. We create human-readable slugs via htaccess in Davis for recurring events, which we shouldn't be bothered to do for one-off events.

Side note: UID is actually required always - our PR workflow fails without it.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think the GUID was only needed when we generated events manually. Now, with the dedicated calendar tool, I think we can remove the CI check and the GUID from the files. Then we can still give the path to whatever Davis ends up giving as link.

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.

Ok, we can drop the GUID being mandatory for events. Events then should have either a calendar-path or a guid (as written in the template).
Because it's currently not possible to subscribe to a specific event via CalDAV (see link to Davis), we have two options for recurring events:

  1. provide only an all-events CalDAV link
    • downside: folks are maybe less likely to subscribe as they're only interested in the community call and don't want to have all the Needs: Decision calls.
  2. provide an all-events CalDAV link + guid-based iCal link to the event series
    • downside: the iCal link doesn't provide calendar name or colour and (at least on Android) you need a special app (e.g. ICSx5) to subscribe.
difference between CalDAV and iCal according to Claude

Both rely on polling — neither method has true server push in practice.

With iCal, the client downloads the full .ics file on whatever interval it's configured for (often every hour or even less frequently, since it's a crude fetch).

With CalDAV, it's also polling, but typically at a shorter interval (Thunderbird defaults to every 30 minutes, though configurable). The advantage is that CalDAV only fetches what's changed since the last sync rather than re-downloading everything, so shorter poll intervals are cheaper and more practical.

There is a CalDAV extension called calendar-auto-schedule and a push notification mechanism, but real server-push for CalDAV is rare in self-hosted setups and Sabre/Davis doesn't implement it as far as I know. So in your case, both methods would effectively behave the same way in terms of update latency — it's just a matter of how aggressively the client polls.

Do you have a preference between the two?


---

Event description goes here. Displayed on the event detail page, and used for the body of the ICS calendar event.
Event description goes here. Displayed on the event detail page.
4 changes: 2 additions & 2 deletions _events/2022-07-22-10 year anniversary.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
---
title: 10 Year anniversary 🎉
uid: c9c773d2-8106-4075-89b6-e071a1daedeb
timezone: Europe/Brussels
datetime-start: 2022-07-22 18:00
datetime-end: 2022-07-22 19:00
recurring: no
location: online
more-information: https://forum.antennapod.org/t/antennapod-10-years-anniversary-call-friday-at-18-00-6-pm-cest/2184
meeting-room: https://meet.antennapod.org/10YearsAnniversary
meeting-room: 10YearsAnniversary
uid: c9c773d2-8106-4075-89b6-e071a1daedeb
---

AntennaPod’s very first release was on 2012-07-22. This is also when the app was first uploaded to Google Play. AntennaPod is turning a decade old!
Expand Down
4 changes: 2 additions & 2 deletions _events/2026-01-31-fosdem.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
---
title: FOSDEM meetup
uid: d9342ce0-e029-4fe4-805a-50fda92d2f4f
uid: 9223c695-e382-4ad5-9340-856388138ab3
timezone: Europe/Brussels
datetime-start: 2026-01-31 19:30
datetime-end: 2026-01-31 21:30
recurring: no
more-information: https://forum.antennapod.org/t/antennapod-fosdem-2026/7923
image: brussels.jpg
blog-post: 2026/02/fosdem
location: node/13473395006
---

Some core AntennaPod contributors plan to join the [FOSDEM](https://fosdem.org/2026/) conference in Brussels from the 31th of January to the 1st of February. We plan to grab some drinks together on Saturday at 19:30. To join, please leave a post on [our forum](https://forum.antennapod.org/t/antennapod-fosdem-2026/7923).
15 changes: 15 additions & 0 deletions _events/community-call.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
title: Monthly community call ☎ 🎙
summary: Our monthly call to discuss anything AntennaPod (and beyond). Join us!
uid: 0718779a-5b92-48df-87e3-801e02154c06
Comment thread
keunes marked this conversation as resolved.
calendar-path: community-call
Comment thread
keunes marked this conversation as resolved.
timezone: Europe/Brussels
datetime-start: 2022-04-09 18:00
recurring: yes
recurrence-text: every-2nd-saturday
location: online
more-information: https://forum.antennapod.org/t/monthly-community-call/1869
meeting-room: community-call
---

{% tf "events/{{ page.slug }}.md" %}
34 changes: 0 additions & 34 deletions _events/community-meeting.md

This file was deleted.

18 changes: 3 additions & 15 deletions _events/needs-decision.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,15 @@
---
title: "Needs: Decision - AntennaPod UX discussions"
summary: A bi-weekly meeting where core contributors discuss feature requests & make tough choices.
permalink: /events/:slug
uid: TDL9-28GB-50YV-P6X4-D48Y
sequence:
# Optional. Defaults to 0 if left empty. Should be increased with 1 on every big event edit.
uid: dcb8867b-32a2-493f-8a43-60ff885028ed
calendar-path: needs-decision
timezone: Europe/Brussels
datetime-start: 2024-02-14 20:30
datetime-end: 2024-02-14 21:30
recurring: yes
recurrence-text: 2nd-4th-wednesday
recurrence-rule: FREQ=WEEKLY;INTERVAL=2;BYDAY=WE
recurrence-exceptions:
- 2024-07-02
recurrence-additions:
# List of date-times on which the event is additionally taking place.
- start: 2023-12-28 21:00
end: 2023-12-28 22:30
- start: 2024-07-10 21:00
end: 2024-07-10 22:30
location: online
more-information: https://github.com/AntennaPod/AntennaPod/issues?q=state%3Aopen%20label%3A%22Needs%3A%20Decision%22
meeting-room: https://meet.antennapod.org/needsdecision
meeting-room: needs-decision
---

We are very careful about AntennaPod's User Experience (UX). The [project's goal](/about) here is to balance simplicity with feature-richness. Sometimes that requires some hard thinking on how to implement a feature request.
Expand Down
5 changes: 3 additions & 2 deletions _i18n/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -292,8 +292,9 @@ events:
upcoming-events: "Upcoming Events"
past-events: "Past Events"
download-ics: "Download ICS file"
copy-url: "Copy calendar URL"
announce-add-calendar: "Always want to have the latest events and update community call information at hand? Then subscribe to our calendar in your favorite app via the 'Add to calendar' link!"
subscribe-event: "Copy event URL"
subscribe-all: "Copy URL for all events"
announce-add-calendar: "Always want to have the most up-to-date event information at hand? Subscribe to our calendar in your favorite app via the 'Add to calendar' link!"
links:
add-calendar: "Add to calendar"
more-information: "More information"
Expand Down
3 changes: 3 additions & 0 deletions _i18n/en/events/community-call.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Every month we meet to discuss anything related to AntennaPod. From feature and enhancement suggestions by contributors, via usability questions and donation expense proposals, to branding updates.

We’ll discuss and announce the next topics, and report back on what we discussed on the forum.
3 changes: 0 additions & 3 deletions _i18n/en/events/community-meeting.md

This file was deleted.

3 changes: 2 additions & 1 deletion _i18n/en/general/event-sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ Do you know of an event in your neighbourhood and would love to meet up with Ant

[Propose a meet-up](https://forum.antennapod.org)

<!-- mdpo-disable --><a href="{{ site.baseurl }}/events.ics" target="_blank" data-toggle="modal" data-target="#icsModal"><!-- mdpo-enable -->Add our events to your calendar<!-- mdpo-disable --></a><!-- mdpo-enable -->
{% assign calendar_base_url = site.data.event-links | where: 'key', 'calendar-path' | map: 'url' | first %}
<a href="{{ calendar_base_url }}all-events" onclick="copyUrl(event);" data-bs-toggle="tooltip" data-bs-trigger="manual" data-bs-title="{% t generic.accessibility.copied %}" data-copy-url="{{ calendar_base_url }}all-events">Add our events to your calendar</a>
4 changes: 1 addition & 3 deletions _i18n/en/general/events-add-calendar-modal.md
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
Always want to have the latest community call dates and times in your calendar? Then copy the URL and add it as a remote calendar in your calendar app.

Hope to see you!
Want to download the calendar file of this gathering, or subscribe to all our calls and meetings?
Comment thread
keunes marked this conversation as resolved.
17 changes: 0 additions & 17 deletions _includes/ICS-modal.html

This file was deleted.

26 changes: 26 additions & 0 deletions _includes/add-to-calendar-modal.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<div class="modal fade" id="addToCalendarModal" tabindex="-1" aria-labelledby="addToCalendarModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="addToCalendarModalLabel">{% t events.links.add-calendar %}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
{% tf general/events-add-calendar-modal.md %}
</div>
<div class="modal-footer border-0 pt-0">
<button type="button" class="btn btn-secondary" onclick="copyUrl(event);" data-bs-toggle="tooltip" data-bs-trigger="manual" data-bs-title="{% t generic.accessibility.copied %}" data-copy-url="{{ calendar_subscription_url }}">{% t events.general.subscribe-all %}</button>
{% comment %}
Comment thread
keunes marked this conversation as resolved.
Disabled: Davis does not yet support event-specific subscription links
See https://github.com/tchapi/davis/issues/260
{% if page.recurring == true -%}
<button type="button" class="btn btn-primary" onclick="copyUrl(event);" data-bs-toggle="tooltip" data-bs-trigger="manual" data-bs-title="{% t generic.accessibility.copied %}" data-copy-url="{{ event_subscription_url }}">{% t events.general.subscribe-event %}</button>
{%- elsif page.uid %}
<a role="button" class="btn btn-primary" href="{{ event_ics_url }}">{% t events.general.download-ics %}</a>
{%- endif %}
{% endcomment %}
<a role="button" class="btn btn-primary" href="{{ event_ics_url }}">{% t events.general.download-ics %}</a>
</div>
</div>
</div>
</div>
13 changes: 13 additions & 0 deletions _includes/event-link-visible.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{%- if page[link.key] or link.key == 'calendar-path' -%}
{%- unless link.key == 'location' and page.location == 'online' -%}
{%- unless link.key == 'meeting-room' and page.location != 'online' -%}
{%- unless link.key == 'meeting-room' and status == 'past' -%}
{%- unless link.key == 'calendar-path' and page.recurring != true and page.uid == nil -%}
{%- unless link.key == 'calendar-path' and status == 'past' -%}
1
{%- endunless -%}
{%- endunless -%}
{%- endunless -%}
{%- endunless -%}
{%- endunless -%}
{%- endif -%}
2 changes: 1 addition & 1 deletion _includes/share.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<div class="d-inline-flex align-items-center">
{%- assign author = site.data.authors[page.author] %}
<p class="small text-body mb-0 me-2">{% t generic.share %}</p>
<button title="{% t generic.accessibility.copy %}" class="bg-transparent border-0 p-0" onclick="copyUrl();" data-bs-toggle="tooltip" data-bs-trigger="click" data-bs-title="{% t generic.accessibility.copied %}" value="{{ site.url }}{{ page.url | replace: '.html', '' }}">
<button title="{% t generic.accessibility.copy %}" class="bg-transparent border-0 p-0" onclick="copyUrl(event);" data-bs-toggle="tooltip" data-bs-trigger="manual" data-bs-title="{% t generic.accessibility.copied %}" data-copy-url="{{ site.url }}{{ page.url | replace: '.html', '' }}">
<i class="fa-solid fa-link fs-5 text-body-tertiary me-2"></i>
</button>
<a title="{% t generic.accessibility.share-fb %}" href="https://www.facebook.com/sharer/sharer.php?u={{ site.url }}{{ page.url | replace: '.html', '' }}"
Expand Down
Loading