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:

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.