I’ve built a small utility that continuously syncs events from an iCalendar (ICS) feed into a Discourse category via the REST API.
This isn’t a full Discourse plugin — it runs alongside your Discourse install — so it belongs here in #extras. If you want to display calendar events from an external source (e.g. Google Calendar, University timetable feeds, etc.) inside Discourse topics, this will be useful.
Repository
How it works
- Reads events from a given ICS feed
- Matches them against existing topics (by UID or fallback to time/location)
- Creates or updates topics in your chosen category
- Can run continuously as a
systemd
service (safe against duplicate execution via flock)
Requirements
- Ubuntu 24.04 LTS (tested)
- Python 3 (already in Ubuntu 24.04 LTS)
- A Discourse API key
- A category ID to target for event topics
Example output
Here’s what it looks like when syncing a University timetable ICS feed into Discourse:
Quick start
Clone the repo and install requirements:
git clone https://github.com/Ethsim12/Discourse-ICS-importer-by-REST-API.git /opt/ics-sync
cd /opt/ics-sync
pip install -r requirements.txt
Run a sync once manually:
python3 ics_to_discourse.py \
--ics "https://example.com/feed.ics" \
--category-id 4 \
--site-tz "Europe/London" \
--static-tags "events,ics"
Set up as a systemd service/timer for continuous sync (example configs in the repo).