Personal AI Assistant
One email every morning with everything I need to act on that day.
I built a personal AI assistant to pull together the things I was constantly checking in different places: coursework and deadlines in Canvas, meetings in my calendar, applications and coffee chats in my own tracker artifact, and career and social events in a separate website.
The problem
Important dates were scattered across four different places. I had deadlines in Canvas, interviews and meetings in my calendar, application deadlines and networking follow-ups in my tracker, and career events in a text file.
I kept missing things despite having reminders everywhere. The problem wasn't a lack of reminders. It was that no single place gave me the full picture.
What I built
I set up a scheduled job that runs every morning at 7:30 and pulls information from all four sources into one email. The brief is organized into six sections, so I can quickly see what is due, who I need to follow up with, and which applications or events need attention.
Coursework comes through the Canvas API, meetings come from my calendar, and applications and outreach come from my own tracker. The email is sent through SMTP using credentials scoped specifically to the project.
What I learned along the way
The first version worked, but using it every day exposed a lot of edge cases.
Some calendar invitations were duplicated in the coursework section, so I added filtering to keep only actual meetings in the calendar section.
The assistant also kept reminding me about assignments I had already submitted. I changed it to check submission status, so completed work disappears while overdue work continues to show up until it's done.
Assignments appear and get submitted, applications open and close, and new events are posted every week. A static to-do list would have gone stale within days.
So the assistant re-reads everything each morning and compares it to what it saw yesterday. It notices coursework that was added overnight, drops what I have already handed in, and when something new shows up that looks relevant — an event worth going to, an application that just opened — it surfaces it and tells me to take a look. That judgment is the part that makes it an assistant rather than a list.
Stack
Python, Canvas REST API, Google Calendar API, SMTP, a scheduled task, and Claude Code for all of it.
See it
Four surfaces that change every day, reduced to one short email.
EventsHaas & Luma
12
Agent runs at 07:30
Reads the current state of all four, checks newly added assignments and potentially interesting events, works out what actually needs attention today, and writes the email.
- diff vs yesterday
- drop submitted
- check fit to my interests
- rank by urgency
- flag what’s new
Gmaildelivery, over SMTP
7 things to act on
Your Thursday brief · 21 Sep
Exams & midterms
- Data & Decisions midterm — Tuesday, 6 days
On your calendar
- 09:00 Coffee chat — A. Rivera, product lead
- 16:30 Group meeting — accounting deck
Due
- Problem set 3 — due today
- Reflection memo — due Friday
Applications closing
- Summer PM internship — closes Friday
Outreach
- Follow up with 3 contacts past their date
Career events
- Tech industry panel — Monday 17:00
Worth a look
- New this week: SF Tech Week — AI Demo Night, Thursday 18:00 — check it out
Sent every weekday at 07:30
Sample output. Courses, contacts and deadlines are invented.