How DC Tech Events works
The main DC Tech Events site is generated by a custom static generator, in three phases:
- Loop through the groups directory and download a local copy of every calendar. Groups must have an iCal or RSS feed. For RSS feeds, each item is further scanned for an embedded JSON-LD Event description. I’ll extend that to support other metadata formats, like microformats (and RSS feeds that directly include event data) as I encounter them.
- Combine that data with any future single events into a single structured file (YAML).
- Generate the website, which is built from a Flask application with Frozen-Flask. This includes two semi-secret URL’s that are used for the newsletter: a simplified version of the calendar, in HTML and plaintext.
Once a day, and anytime a change is merged into the main branch, those three steps are run by Github Actions, and the resulting site is pushed to Github Pages.
The RSS + JSON-LD thing might seem arbitrary, but it exists for a mission critical reason: emojis! For meetup.com groups, the iCal feed garbles emojis. It took me some time to realize that my code wasn’t the problem. While digging into it, I discovered that meetup.com event pages include JSON-LD, which preserves emojis. I should probably update the iCal parser to also augment feeds with JSON-LD, but the current system works fine right now.

Anyone who wants to submit a new group or event could submit a Pull Request on the github repo, but most will probably use add.dctech.events. When an event or group is submitted that way, a pull request is created for them (example). The “add” site is an AWS Chalice app.
The newsletter system is also built with Chalice. When someone confirms their email address, it gets saved to a contact list in Amazon’s Simple Email Service(SES). A scheduled task runs every Monday morning that fetches the “secret” URL’s and sends every subscriber their copy of the newsletter. SES also handles generating a unique “unsubscribe” link for each subscriber.
(but, why would anyone unsubscribe?)