← Back to Stuff

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.

Claude AgentsGoogle CalendarSupabaselaunchd

How it runs

  1. 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. 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. 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. 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

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.