Automatic Meeting Prep
A meeting shows up on my calendar. By the time it starts, a brief telling me who I am about to talk to is waiting for me on a private page. Nobody asked for it and nobody ran anything — and nobody else can read it. The brief never touches the calendar event itself.
How it runs
- 1
Poll the calendar
Every five minutes, a launchd job on my Mac makes one cheap Claude call to pull the next 14 days of events off the calendar.
- 2
Diff against what's prepped
Each event is hashed and compared against what's already stored. Most events are skipped here: unchanged, all-day, or nobody else in the room.
- 3
Research the meeting
For everything left, a Claude agent session runs with the meeting's title, attendees, and invite notes, and researches who is in the room.
- 4
Store it privately
The brief is written to Supabase, keyed to the event, and never touches the calendar. It's read at a page only I can sign into.
The interesting problem
The first version wrote the brief into the meeting’s own description. That has an obvious flaw: the description is shared, so whatever the agent researched about the people in the room, everyone invited could read too. It also had a subtler one — writing to the event changes the event, Google notices, and a naive system loops on its own edits until someone notices the bill.
Both problems have the same root: the calendar event is the wrong place to put a private note. So nothing writes to the calendar anymore. A local agent on my Mac polls it read-only, and the brief goes to Supabase instead — a database only my own credentials can write to and only I can read from.
The re-prep problem — not re-researching a meeting that hasn’t changed — still needed solving, just without the calendar as the source of truth. Each event is hashed from its title, time, attendees, and notes, and the hash is stored alongside its brief. Nothing about that changes on a poll and the event is skipped; move the meeting or add someone and it re-preps.
Things I got wrong first
- The description is shared. Whatever the agent wrote, everyone invited could read. That is the reason the calendar isn’t where briefs live anymore.
- Calendar writes email everyone by default. The write-back version would have sent every attendee a notification each time it annotated a meeting.
- Push subscriptions expire silently. Google drops a webhook subscription after about a week with no warning and no error — part of why the whole hosted push pipeline got replaced with a dumb five-minute poll.
Built with the Claude Agents CLI and Google Calendar MCP, running as a launchd job on my Mac, storing to Supabase, and read at a private, owner-gated page on this site. Briefs are private — nothing an attendee sees.