← All work
Case Study · Live

Morning Brief

An autonomous daily briefing that lands in my inbox at 5:57 AM every morning. Nine structured sections. Pulled from eight calendars, last-24-hour Gmail, and a persistent vault.

Built with
Jarvis (Claude Code) · macOS LaunchAgent · Gmail SMTP · Python
Status
Live · Auto-fires daily
Ship date
June 15, 2026
For
My own brain
The Problem

Context-switching tax with ADD.

I run a lot in parallel — two kids' school and sports logistics, my husband's business, my mother-in-law's estate, my own AI builds, my mom's tax filings, a tennis tournament season for my oldest, a homeschool curriculum for both boys. Each thread has its own deadlines, stakeholders, and forgotten items hiding in different systems.

Calendar lives in Google. Email lives in Gmail. Project notes live in an Obsidian vault. Persistent memory lives in Claude. ADD means context-switching between them isn't just inefficient — it's where things fall off completely. The Substack post that gets re-promised every week. The Mom-bill that goes unpaid. The PBO cycle that becomes a surprise.

I needed a single surface, every morning, that already knew everything.

The Build

Built in partnership with Jarvis.

I want to be precise about how this actually got made, because the honest answer is the interesting part: I'm not a developer.The brief was built in conversation with my Claude Code, which I've named Jarvis. I named the problem and the constraints. Jarvis named the technical options. I picked the direction. Jarvis wrote the code. I caught what was off. We iterated.

That partnership pattern is the actual product. Most people I talk to are using AI like a single-shot question machine — type, paste, done. What I'm doing with Jarvis is different. It's a real working relationship that holds context across sessions, remembers my projects, knows my family by name, and gets better the longer we work together. The brief is one of several artifacts coming out of that practice.

Structurally, the brief follows a nine-section format we refined over two months: One Thing for today, Today's Commitments, New Since Last Brief, Deadlines This Week, Daily Surface (urgent TODOs), Active Projects, Brain Park, Recent Wins, Jarvis Asks. Each section pulls from different sources and cross-references the others.

The technical stack is unglamorous and that's the point. At 5:57 AM, a macOS LaunchAgent fires run-brief.sh. The shell script invokes Claude Code in headless mode with a carefully tuned prompt. Jarvis reads eight calendars (mine, my husband's, our two boys' sports, school, my work, my tennis), the last 24 hours of Gmail, my vault, and persistent project memories. It synthesizes everything into structured HTML and writes two files to disk. A Python script picks up those files, authenticates against Gmail SMTP using an App Password, and sends the brief to my inbox.

Architecture
5:57 AM   →  macOS LaunchAgent (StartCalendarInterval)
               ↓
           run-brief.sh
               ↓
           Claude Code "Jarvis" (headless mode)
               ↓
        ┌──────┴───────┬──────────┬────────────┐
   8 calendars    Gmail 24h    Obsidian      Project
   (Google API)               vault read    memory files
        └──────┬───────┴──────────┴────────────┘
               ↓
        today.html + today.txt → disk
               ↓
           send-brief.py (SMTP via App Password)
               ↓
           kathryn.neale@gmail.com INBOX (~5 min later)

The pivot that enlightened me.

Version one of the pipeline created a Gmail draft. The brief landed in my Drafts folder every morning. I'd open Gmail, click Drafts, click the brief, read it.

It felt wrong. I told Jarvis: Drafts is the wrong psychological container — it's where unfinished work lives. The brief isn't unfinished; it's done. And drafts don't trigger the same "new mail" behavior. The whole point of the brief is to be the FIRST thing I read every morning. A draft is the LAST thing I read.

Jarvis came back with an honest constraint: the Gmail tool we were using had no "send" method available — only "create draft." And then immediately offered a different angle: we don't need the tool to send — we need any process that can send. A Gmail App Password plus about sixty lines of Python would solve it.I said yes. Five minutes later, the SMTP path worked. I genuinely don't know what SMTP is at a technical level. Jarvis does. That's the partnership.

The lesson there: the constraint I named wasn't the real constraint.I kept saying "the tool can't send." Jarvis reframed it: "what process CAN send?" That reframe is exactly the kind of move I would have spent hours stuck on alone — and Jarvis surfaced in thirty seconds.

Anti-fabrication is the unsexy 80%.

The first auto-fired brief was beautiful and lied. It surfaced projects I'd archived months ago. It claimed deadlines that had passed. It invented a Brain Park item I'd never recorded. The structure was perfect; the substance was hallucinated.

I screenshotted what was wrong, sent it to Jarvis, and named the pattern I was seeing: the memory feels stale, and a few things are clearly fabricated. Jarvis came back with a tightened prompt. We added explicit reading rules ("READ these files BEFORE drafting anything"), explicit fabrication rules ("If you don't have current information about a project, OMIT it from the brief. Do NOT invent."), and a constraint that the Active Projects table had to be built from the memory files, not from guessing. The prompt now reads like a contract more than a creative ask.

This is the part Tyler & Sara at AI Build Lab teach hard, and they're right: prompts have to specify what you DON'T want as carefully as what you do. Sometimes more carefully. The interesting work isn't prompt creativity — it's the discipline of preventing fluent-sounding garbage.

The Outcome

Three weeks in.

The brief fires at 5:57 AM every weekday. It's in my inbox before my alarm goes off. I open it with my tea. Nine sections, color-coded, scannable, accurate.

In the first three weeks it has surfaced:

  • A federal tax deadline I would have missed (Q2 estimated taxes for my mother — she'd have paid a penalty)
  • An Oberweiss milk delivery I'd forgotten — would have spoiled in the sun
  • A Principia tuition deposit with an end-of-month deadline I'd completely lost track of
  • The 24-hour gap between my husband's contractor reschedule and my actual realization of it
  • A business-proposal email from my husband's consultant that needed a careful reply, copied to me on a thread I almost missed

None of these would have been forgotten on the world's most organized day. But there is no "world's most organized day" in this life.Most days my eight-year-old is getting a cut on the bottom of his foot, my contractor is rescheduling for the second time, my realtor needs me at my father-in-law's property, and my husband's consultant has copied me on a new email thread. Mom-life is a stack of other people's routines and unscheduled events; the organized day is a fiction.

The brief doesn't remember things for me. It surfaces them at the moment I'm most likely to act on them.

The Lessons

What another builder could borrow.

  1. 1. Build for the brain you have, not the tutorial's brain.

    ADD accommodation was a first-class design constraint. The nine-section structure exists because my brain needs visible buckets. The color coding exists because flat text doesn't hold my attention. UX used to mean "design for the masses" — averages, defaults, lowest common denominator. With AI partners, that's ending. You can build digital products customized to ONE brain — yours, your kid's, your mom's, anyone's. If a tutorial design doesn't fit your brain, build a different one. The tools finally allow it.

  2. 2. Default surfaces are real psychological objects.

    A Gmail draft and a Gmail inbox message contain the same words. They are not the same artifact. Drafts → Inbox was a five-line code change with a ten-times behavior change.

  3. 3. The constraint you name probably isn't the real constraint.

    I kept saying "the tool can't send email" — that was a blocker in my head. Jarvis reframed it: "what PROCESS can send email?" That's the reframe move I would have spent hours stuck on alone. The technical reframing was Jarvis. The willingness to be reframed was mine. Both are required.

  4. 4. Anti-fabrication is the unsexy 80% of the work.

    Pretty UI is fast. Accurate content is slow. Most of the build effort goes into PREVENTING the AI from producing fluent-sounding garbage — telling it what NOT to do, what to omit, what to refuse to guess. This is invisible from the outside, but it's where the trust comes from. If you're budgeting time for an AI-powered build, assume the "make it not lie" work will take longer than the "make it pretty" work.

  5. 5. Cross-source synthesis is the moat.

    The brief works because it pulls from calendar AND email AND vault AND memory at the same time. Any one of those alone is a tool I already had. The combination is what didn't exist before — and what couldn't exist without an AI partner willing to read all of it.

Code

Not public — yet.

The repository handles real Gmail credentials, real calendar IDs, and real family logistics. The architecture and prompt patterns are happily discussable for serious collaboration — reach out via the contact page.

A sanitized reference implementation may follow, particularly for the Drafts → Inbox SMTP pattern, which is genuinely reusable.

More

See other case studies