I Automated My Morning Routine Into a Single Email
Every morning at 7am Pacific, two emails land. One for me, one for my wife. Each one is a personalized daily brief with everything we need to start the day. It costs $0.003 per day to run, and it replaced a 20-minute routine of checking 6 different apps.
The morning chaos before
Here's what my morning used to look like:
- Check weather app (is it going to rain? what should Mayer wear?)
- Check calendar (any meetings before 9?)
- Check email for anything urgent
- Check market pre-open (I work in investment banking, so this matters)
- Check if any packages are arriving today
- Tell Elizabeth the weather and kid logistics
That's 6 apps, 15-20 minutes, before coffee. And half the time I'd forget to tell Elizabeth about the schedule change or the package arriving.
The dashboard nobody opened
My first attempt was a Notion dashboard. It had everything — weather, calendar, markets, tasks, the works. Beautiful. Comprehensive.
Nobody opened it.
Not even me. The friction of opening a browser, navigating to Notion, and finding the right page was enough to kill it. I'd default back to checking individual apps because muscle memory is stronger than good intentions.
The insight: the delivery mechanism matters more than the content. An email that arrives at 7am gets read. A dashboard that exists somewhere gets ignored.
What's in the emails
Travis's brief (mine):
- Weather forecast with emoji (yes, emoji — it's the fastest way to parse weather at 6:58am)
- Today's calendar events with times
- Pre-market S&P 500 and 10-year Treasury moves
- Unread email count + any flagged urgent messages
- Package deliveries expected today
- Kalshi betting positions summary (I run weather/economics prediction bets)
- Any overnight alerts from my monitoring system
Elizabeth's brief (my wife's):
- Same weather and calendar
- Content ideas for her esthetician TikTok (with specific hooks and settings)
- Trending skincare products for her affiliate business
- Kid logistics (soccer practice? school events?)
- Family calendar conflicts or coordination needed
The key difference: her brief includes business intelligence for her esthetician and affiliate marketing work. It's not just "here's your day" — it's "here's your day, and here are 3 TikTok video ideas based on what's trending in skincare right now."
The newsletter noise problem
The hardest part wasn't building the brief — it was taming the inbox. I subscribe to maybe 40 newsletters. Market recaps, tech news, deal alerts, skincare industry stuff. Most mornings, 15-20 of those are sitting unread, and they make the inbox look overwhelming.
The fix: an inbox cleanup job that runs 5 times daily. It auto-labels newsletters, archives low-priority ones, and marks promotional emails as read. By the time the daily brief runs at 7am, the inbox is already clean, and the brief only surfaces emails that actually need attention.
# Simplified inbox cleanup logic
NEWSLETTER_SENDERS = load_known_senders() # ~200 senders
for email in get_unread():
if email.sender in NEWSLETTER_SENDERS:
label(email, 'Newsletter')
archive(email)
elif is_promotional(email):
mark_read(email)
label(email, 'Promo')
# Everything else stays in inbox for the brief to surface
The LLM decides what's promotional using Haiku 4.5. It costs about $0.001 per email classification. For 20 emails a day, that's $0.02/day. Not zero, but close enough.
ThreadPoolExecutor: 52 seconds to 12
The original brief took 52 seconds to generate. That's because it was serial — fetch weather, then fetch calendar, then fetch emails, then fetch markets, then format, then send.
The obvious fix: do the fetches in parallel.
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=6) as executor:
weather_future = executor.submit(get_weather)
calendar_future = executor.submit(get_calendar_events)
email_future = executor.submit(get_email_summary)
market_future = executor.submit(get_market_data)
packages_future = executor.submit(get_package_status)
kalshi_future = executor.submit(get_kalshi_positions)
weather = weather_future.result()
calendar = calendar_future.result()
# ... etc
52 seconds down to 12. The bottleneck shifted from API calls to the LLM formatting step, which takes about 4 seconds. The rest is just network latency for 6 parallel API calls.
This matters because both briefs need to go out at 7am. If one takes a minute, the other waits. With parallel fetching, both emails land within seconds of each other.
The $0.003/day math
Here's the actual cost breakdown per day:
| Component | Cost |
|---|---|
| Weather API (Open-Meteo) | Free |
| Calendar API (Google) | Free |
| Gmail API (Google) | Free |
| Market data (Brave Search) | Free |
| LLM formatting — Travis brief (Haiku 4.5) | $0.001 |
| LLM formatting — Elizabeth brief (Haiku 4.5) | $0.001 |
| Inbox cleanup LLM calls | $0.001 |
| Total | $0.003/day |
That's about $1.10 per year. The VPS that runs it costs $5/month, but it runs 30 other jobs too, so the marginal cost of the daily brief is effectively zero.
The unexpected benefit
Here's what I didn't expect: both briefs landing at the same time changed how Elizabeth and I start our day.
Before, I was the information bottleneck. "Hey, do we have anything tonight?" "Is it going to rain?" "When's Mayer's soccer?" Now she has her own brief with her own calendar view, her own content ideas, her own business intelligence. She doesn't need to ask me, and I don't need to remember to tell her.
The briefs also became a coordination tool. When we both know the day's schedule, we can divide and conquer without a morning logistics meeting over coffee. "I saw soccer is at 4 — I'll grab him, you do the grocery run" just happens naturally because we both read the same calendar data.
It also forced me to centralize our calendars. Before building the brief, our calendars were a mess — some stuff on my Google Calendar, some on hers, kid stuff split between both. Making the brief useful meant getting all events into a system the brief could query. The automation created the organizational discipline I never had the motivation to build on its own.
How to build your own
If you want something similar, here's my honest advice:
- Start with email delivery. Don't build a dashboard. Don't build an app. Send yourself an email. You'll actually read it.
- Use the cheapest LLM that works. Haiku 4.5 formats my brief perfectly. I don't need Opus for "make this weather data readable."
- Parallelize from day one. Serial API calls are the silent killer of morning automations. If your brief takes 60 seconds, it'll drift later and later as you add sections.
- Build for two people. Even if you're single, think about what a second person in your life would want. It forces you to make the system modular instead of hardcoded to your preferences.
- Run it for a week before adding features. My first brief had 12 sections. I cut it to 7 after realizing I was skimming half of them. Less is more at 7am.
The whole thing is about 400 lines of Python, runs on a $5 VPS, and has been reliable for over a month. It's the single automation I'd rebuild first if I had to start over.
Top comments (0)