I've written before about building a family calendar system, automating it with GitHub Actions, and keeping a weekly school digest running with Gemini. This post ties those threads together — because we just made a change that finally connects all three into a single source of truth.
The Problem with Multiple Sources
Earlier posts in this series covered each piece individually:
- Taming the Chaos: Building a Family Calendar System for Three Kids — the original page pulling events from GameChanger, TeamSnap, Blue Valley, and St. Michael
- Automating Family Calendar Chaos with GitHub Actions — a script that runs every 6 hours, merges all the sports feeds, and publishes a single combined calendar file
- Bringing AI Into Everyday Life — a Google Apps Script that reads school emails and generates a Sunday digest with Gemini
- Keeping the Weekly School Digest Alive with Gemini — keeping that digest running after ChatGPT lost its Drive connector
The issue: the calendar sources were configured in two separate places. The GitHub automation had them in one file. The Google Apps Script had the same list hardcoded separately. Every time a sports team changed mid-season, I had to update both. Inevitably, they'd drift apart.
The Fix: One Feed, Two Places
The GitHub automation already produces a single combined calendar file and publishes it online every 6 hours. That file pulls together all the sports schedules and tags each event with which calendar it originally came from.
We made two things point at that one file.
The Family Events Page
The calendar page was rebuilt so sports events load directly from the combined file, while school calendars (Blue Valley, Overland Trail, St. Michael) are still pulled live from their source. A small "synced · Xm ago" indicator shows how recently the sports data was refreshed.
Each event is automatically matched to the right child based on keywords in the event title — team names, grade levels, and program names — so the per-child filters on the page still work exactly as before. The download button links directly to the combined file, so subscribing to the feed and browsing it in the browser pull from the same source.
The Weekly Digest
The Google Apps Script that powers the Sunday email digest was updated to pull sports events from the same combined file instead of fetching each sports calendar separately. It reads the source tag on each event to label it correctly in the digest output — so each sport still shows up attributed to the right activity, even though everything came from one place.
While we were in the digest, we also expanded the list of school-related email senders it searches — adding recreation programs, soccer leagues, school flyer services, and activity platforms — and updated the AI prompt to go deeper into the weekly newsletter content. Instead of a surface summary, it now pulls out specific topics covered in class, upcoming tests and due dates, and action items parents need to act on.
The Result
When a new sports season starts and a calendar link changes, there's one place to update it. Within a few hours, both the events page and the Sunday digest automatically reflect the change. No duplicate config, no hunting through a Google Apps Script nobody has touched since last fall.
It's a small change, but it's the kind that quietly saves time every season.
Check out the family events page or browse the code on GitHub.