← All projects
shipped 2026

Morning Brief Agent

A friendly daily email: workout, weather, one calm signal.

Morning Brief Agent hero
The brief as it arrives: the day's workout, the Miami forecast, and a short hand-written note, one screen on a phone.

Why this exists

I wanted the first thing read every morning to be a single calm signal, not the news, not group chats, not Slack. Something that answers two questions cleanly: what’s the workout today, and what is it going to feel like outside.

Off-the-shelf “habit” apps drown that in dashboards and streaks. The brief is the opposite: one short email. No app to open.

What it does

Every day at 06:30, an inbox gets a short, warm note that includes:

It’s intentionally one screen tall on a phone. If you have to scroll, the brief failed.

How it works

The flow is simple. That is the point.

  1. Trigger: A scheduled GitHub Action wakes a Python script at 06:30 local time
  2. Fetch: Two parallel API calls: OpenWeatherMap for the day’s forecast, and a lookup against a local table of workouts keyed by day-of-week
  3. Compose: Claude is given the raw signals and a tight prompt that fixes tone, length, and structure. It returns a short, friendly note
  4. Send: A plain SMTP send to the recipient’s inbox. No service in the middle, no third-party form

A few choices kept this small: email rather than an app (no install, no notification permission), a single LLM call rather than chained calls, and a hard length cap in the prompt because the model otherwise drifts toward over-helpful (“here are seven tips for your push day”). End-to-end runtime is under five seconds, which means cost is effectively the Claude token spend (low single-digit cents per day) plus the free tier of OpenWeatherMap.

What’s next

What I learned

The lesson was about scope. Early versions used Claude for routing (picking the workout, picking the tone, deciding what to skip) and every failure was a mystery. Now the script handles those decisions and Claude only does the writing. One prompt, one paragraph. That’s the version that’s still running.

Status

Shipped. Running daily. The next iteration is mostly about tone and resilience, not new features.

← All projects