📅 Support iCal Feed Sync in Discourse Calendar Plugin (Import from .ics URLs)

@Ethsim2 This would be a huge feature, and I’ve been digging into how feasible it is now that Discourse is switching to FullCalendar.

@sam linked directly to fullcalendar.io recently, and it turns out FullCalendar now has first-class support for .ics feeds via their official plugin system — so the heavy lifting is already done by the library.


:rocket: Proposal: Enable .ics Feed Sync Using FullCalendar’s Native Support

With the upcoming FullCalendar v6 integration into Discourse, the groundwork is in place to support this feature natively.

FullCalendar’s @fullcalendar/icalendar plugin (with ical.js under the hood) allows you to load public .ics feeds like so:

new Calendar(calendarEl, {
  plugins: [dayGridPlugin, iCalendarPlugin],
  events: {
    url: 'https://example.com/my-calendar.ics',
    format: 'ics'
  }
});

That’s all it takes to render a remote iCal feed into the calendar UI — no custom parsing, just plug-and-play.


:hammer_and_wrench: Suggested Implementation Steps for Discourse

  1. Add @fullcalendar/icalendar and ical.js to the plugin (once FullCalendar v6 is fully landed).
  2. Add an admin/plugin setting (or per-category option) for inputting one or more .ics URLs.
  3. On the client side, render the feed into the calendar view.
  4. (Optional) Implement server-side syncing that:
    • Periodically fetches the feed
    • Parses new/updated events
    • Creates or updates associated Discourse topics

:counterclockwise_arrows_button: Sync Frequency

It’s important to note that FullCalendar’s default .ics handling only fetches the feed on initial calendar load in the browser. That means:

  • There’s no daily or automatic refresh.
  • Users will see a stale copy unless they reload or manually trigger a refresh.
  • There is no persistence — if a user navigates away, the feed data is gone.

To make this truly useful, Discourse would ideally:

  • Run a daily (or scheduled) Sidekiq job that fetches the feed server-side.
  • Cache the parsed events for consistent rendering across users.
  • Optionally link events to topics or create new ones for full integration.

This would allow proper sync behavior and revive a key feature previously handled by Angus’s plugin — but using a clean and maintainable foundation.


:white_check_mark: Benefits

  • Seamlessly integrates .ics feeds from Google Calendar, Outlook, iCal, etc.
  • Makes Discourse a calendar consumer, not just an exporter.
  • Great for community forums, student groups, civic events, etc.
  • Built entirely on supported FullCalendar features — minimal custom JS needed.

Would love to see this land now that the calendar plugin is getting attention again. Happy to help test it or contribute to a proof-of-concept.