DEV Community

Build With Jet
Build With Jet

Posted on

I Automated My Morning Routine Into a Single Email

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:

  1. Check weather app (is it going to rain? what should Mayer wear?)
  2. Check calendar (any meetings before 9?)
  3. Check email for anything urgent
  4. Check market pre-open (I work in investment banking, so this matters)
  5. Check if any packages are arriving today
  6. 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. Start with email delivery. Don't build a dashboard. Don't build an app. Send yourself an email. You'll actually read it.
  2. Use the cheapest LLM that works. Haiku 4.5 formats my brief perfectly. I don't need Opus for "make this weather data readable."
  3. 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.
  4. 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.
  5. 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)