📅 תמיכה בסנכרון הזנת iCal בתוסף Discourse Calendar (ייבוא מכתובות .ics)

i have successfully rebuild my Discourse instance🥲


Discourse’s official discourse-calendar plugin already supports .ics export, which is extremely useful for sharing Discourse events externally. However, many communities — particularly in education, government, or enterprise — rely on external iCal feeds to publish event information (e.g. from Moodle, Office365, Google Calendar, or institutional CMS platforms).

At present, there is no built-in way to import or sync from .ics sources. This limits Discourse’s use as a true calendar hub for communities that already publish important schedules elsewhere.


:sparkles: Feature Proposal

Add iCal feed sync (import from .ics URLs) to the Discourse Calendar plugin.

:white_check_mark: Core Features

  • Configure an .ics feed URL for a calendar-enabled category or topic.
  • Automatically import events into the calendar, matching the .ics feed.
  • Specify a sync interval (e.g. hourly, daily) or allow a manual “Sync now” button.
  • Use the event UID field to prevent duplicates and update modified events cleanly.

:wrench: Optional Configs

  • Tag or label imported events to show their external source.
  • Choose between:
    • One-way sync (external → Discourse only),
    • or two-way sync (editing synced events inside Discourse pushes changes back — future scope).
  • Support multiple .ics feeds per calendar, merged into one view.
  • Visual indication that an event is externally synced (e.g. “Synced from: outlook.university.edu”).

:teacher: Use Cases

Sector Example Use Case
Education Auto-populate student forums with term dates, course schedules, exams, etc.
Government Sync official events from CMS or intranet to a public-facing community calendar
Companies Mirror internal meeting calendars (from Outlook or Google Calendar)
Events forums Integrate speaker lists or session schedules from external providers

:locked_with_key: Security and Privacy

  • Calendar feeds could support public or tokenized access (e.g. URL containing secret token).
  • Support for OAuth2 / Basic Auth could be a future enhancement.

:paperclip: Related


:counterclockwise_arrows_button: Compatibility

This feature would not require discourse-events (now deprecated), and would work natively with the existing Discourse Calendar syntax ([calendar] and [event]). Users would still be able to create native Discourse events manually — iCal sync would just augment these calendars.


Would love to hear if this feature is already on the roadmap — or if others in the community would find it valuable.

Thanks!

5 לייקים

@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.

Sorry @Halden42 but I’m a bit confused about your post.

I understand that Discourse is “fixing the foundations” of the calendar system with the FullCalendar upgrade, but I’m worried about how much time it would take me to manually populate a busy calendar. I use the Discourse GUI every day for everything, and having to duplicate content outside the interface is a non-starter.

I noticed you mentioned a feature I really miss from Angus’s plugin, which I think captures the main point of syncing events into Discourse:

This part would be essential for my use case.

But I’m concerned because you didn’t go into any detail about how that could be implemented. Could you explain what that would look like in practice? Would Discourse create one topic per event? Would it support updates or deletions if the source calendar changes?

That’s the part I’d need to rely on most, and I’m just not sure yet how close we are to it.

Thanks again for your detailed reply.

2 לייקים

תודה @Ethsim2 — זוהי המשך מעולה, ואני חושב שהדאגה שלך היא בדיוק הדבר הנכון: זה לא רק עניין של הצגת אירועים מפיד .ics, אלא של שילובם בדיסקורס בצורה שימושית וניתנת למעקב.

כשאמרתי “לקשר אירועים לנושאים או ליצור חדשים”, דמיינתי הגדרה דומה לאופן שבו הפלאגין של אנגוס עבד בעבר — שבו כל אירוע בפיד היה תואם לנושא בדיסקורס, ועדכונים לפיד היו משתקפים בנושא לאורך זמן.


כרגע, FullCalendar בפני עצמו אינו שומר אירועים — הוא רק מציג אותם מהפיד בטעינת הדף. לכן, אם אירוע נעלם מהפיד (כלומר, הוא בוטל או נמחק חיצונית), הוא פשוט נעלם בשקט מממשק המשתמש של לוח השנה.

אבל זה לא מספיק טוב עבור רוב זרימות העבודה מבוססות הפורום, במיוחד כאשר פוסטים של אירועים משמשים לדיון, אישורי הגעה או הודעות.


הנה מה שהייתי מציע עבור זה:

במקום להסיר את הנושא כאשר אירוע נעלם מהפיד, דיסקורס יכול:

  • להשאיר את הנושא במקומו
  • להוסיף שורה בראש כמו:
    ⚠️ אירוע זה בוטל או הוסר מלוח השנה המקור.
  • אופציונלית לנעול או להסיר את הנושא מהרשימה, בהתאם להעדפת המנהל.

זה ישמר את ההקשר, יאפשר תגובות, ויהפוך את הביטול לנראה לעין — מבלי למחוק דבר. מבחינה טכנית, זה בר ביצוע למדי: פשוט נסמן שה-UID כבר לא קיים בקובץ ה-.ics ונעדכן את הסטטוס של הנושא התואם.


אז כן — בעוד ש-FullCalendar עצמו אינו מנהל את הסטטוס הזה, דיסקורס יכול לטפל בזה בשכבת הסנכרון. המשימה שמביאה את הפיד (למשל, דרך Sidekiq) תעקוב אחר אילו אירועים היו קיימים בעבר וכבר לא, ותסמן את הנושא המתאים בהתאם.

אם מספיק אנשים יתעניינו בזה, אני חושב שנוכל לבנות מפרט מתאים. לא יהיה קשה ליצור אב-טיפוס.

לייק 1

Thanks for the thoughtful reply @Halden42 — this clears up a lot.

What you described here…

…is exactly the core use case I’ve been trying to recover since moving off Angus’s plugin. For me, the most critical part is not just rendering events visually, but syncing a live external calendar into the forum, where each event has a topic, and changes to that event (e.g. cancellation, reschedule) are reflected in that topic over time.

I’d be happy with a one-way sync model to start—read-only from .ics to Discourse—and even just basic update detection would cover 90% of my use cases. A “cancelled” status showing in the event topic if it’s removed from the feed would be ideal too, rather than deleting the topic outright.

If there’s a preferred place to propose a spec for this—perhaps once the FullCalendar upgrade stabilises—I’d be very interested in contributing or testing.

Thanks again.

לייק 1

אנו מתחזקים מספר לוחות שנה של Office 365 — כל אחד עם עדכון .ics משלו — לסוגים שונים של פגישות: הוועדה הבכירה, מפגשי מעורבות ציבורית, קבוצות עבודה פנימיות וכן הלאה. עדכונים אלו כבר מובנים היטב ומתוחזקים באופן קבוע על ידי פקידים וצוותי אדמיניסטרציה.

מה שאנו זקוקים לו בדחיפות הוא דרך ל:

  • להירשם לעדכוני .ics שונים לפי קטגוריה (למשל, עדכון אחד לכל סוג פגישה)
  • ליצור אוטומטית נושא חדש בקטגוריית Discourse המתאימה
  • לוודא שהנושא מגיע לקטגוריה הנכונה, בדומה לאופן שבו התוסף של אנגוס איפשר לנו לסנן לפי תגיות או מטא-דאטה אחרים
  • לשקף שינויים (שעה, כותרת) בנושא אם אירוע הלוח שנה מתעדכן
  • לסמן או לסגור את הנושא באופן אופציונלי אם האירוע מבוטל או מוסר מהעדכון

עבור מועצות כמו שלנו, קטגוריות משמשות לניהול נראות גרנולרית — פגישות מסוימות הן פרטיות (למשל, בכירים או תכנון), אחרות הן ציבוריות. נושא שמועבר באופן שגוי עלול לגרום לחשיפת נתונים רגישים, ולכן אימות ברמת הקטגוריה הוא חובה.

נשמח לראות תמיכה כזו באופן רשמי בעדכון הקרוב של FullCalendar. זה יפחית משמעותית עבודה ידנית ויהפוך את Discourse לאפשרות הרבה יותר בת קיימא כמקור אמת יחיד לתיאום פגישות ושקיפות.

אני סטודנט לרוקחות בארה"ב, והאוניברסיטה שלנו מספקת את כל לוחות הזמנים של הסיבובים, הבחינות והתרגולים שלנו דרך פורטל לוח שנה. כתובות ה-URL של הפיד אינן מסתיימות ב-.ics, אך כאשר אני פותח אותן בכרום, הן מורידות מיד קובץ .ics תקין. אז הן בהחלט פידי iCal סטנדרטיים - רק עם מבנה URL שונה.

עד לאחרונה, השתמשתי בתוסף של אנגוס, והוא טיפל בפידים האלה בצורה מושלמת. כל אירוע יצר נושא, ויכולתי לנתב פידים שונים לקטגוריות שונות (למשל, “תרפויטיקה”, “סיבובים”, “בחינות”), מה שעזר לקבוצת הלימוד שלנו להישאר מאורגנת.

אבל מאז ששגיאת this.router האחרונה שברה את התוסף, נאלצתי להשבית אותו - כמו Ethsim2 - ועכשיו אין דרך קלה לשמור על לוח השנה שלנו מסונכרן.

אם התוסף הרשמי יוכל לתמוך ב:

  • פידי .ics נכנסים (גם אם ה-URL לא מסתיים ב-.ics)
  • יצירת נושאים עם מיקוד קטגוריה
  • תצורה ספציפית לפיד (למשל, פיד אחד → קטגוריה אחת)
  • זיהוי עדכונים וטיפול אופציונלי בביטול אירועים

…זה יהפוך את Discourse לכלי רב עוצמה לשיתוף פעולה אקדמי. זה עבד לנו בצורה מושלמת לפני שהתוסף נשבר - אז אשמח לראות את הפונקציונליות הזו מגיעה באופן מקורי.

אשמח לשתף כתובת URL של לוח שנה לדוגמה באופן פרטי אם זה יעזור בבדיקות.

this applies to Office 365 a-swell, i understand many Universities in the US use that Ecosystem

yep i use that ecosystem :+1:

2 לייקים

לא מופיע ברשימה מכיוון שזה היה במקור משתמש והבובות שלו. אך החשבונות מוזגו וכעת הנושא מבלבל מכיוון שהמשתמש נראה מפרסם הלוך ושוב לעצמו.