Every morning, before I check my phone, Hank — my AI assistant running on OpenClaw — has already done a round of work. By the time I open Telegram, there's a message waiting: current weather, today's calendar, yesterday's WHOOP recovery score, my GCP cloud spend, a handful of AI/tech headlines, and a few content ideas for my site. All assembled, formatted, and delivered automatically. Here's how I built it.
The Problem: Information Is Scattered
I have a lot of data sources I care about in the morning. Weather (I'm in Atlanta — storms appear out of nowhere). Calendar. WHOOP. Cloud costs from experiments I'm running. Tech news I want to stay current on. And I've been building content for this site, so I need a constant drip of ideas.
Before this system, checking all of those things meant opening five different apps, losing five minutes, and still probably missing something. The goal was simple: one message, everything that matters, waiting for me before I start my day.
The Architecture: HEARTBEAT.md
The core of the system is a file called HEARTBEAT.md in my AI workspace. OpenClaw runs a periodic heartbeat poll on a schedule — roughly every 30 minutes — and when Hank receives it, he reads HEARTBEAT.md and follows whatever instructions are there.
That file is a living document. I can edit it at any time to change what Hank checks, how often, and what thresholds trigger a message versus staying silent. It's the configuration layer for my ambient intelligence system — and it's just Markdown.
What Goes Into the Brief
🌤️ Weather — Two Modes
Weather runs in two modes. The first is a storm alert: every heartbeat, Hank checks the forecast for my ZIP code and sends a Telegram message only if severe weather is arriving in the next two hours. No sunny-day noise. Just the alert when it matters.
The second is the morning brief, which runs once per day between 7:30–9:00 AM. This one includes current conditions, the full day forecast with hourly breakdowns, high/low temps, and rain probability. I use wttr.in for the current snapshot and Open-Meteo for the structured hourly data.
📅 Calendar
Hank pulls today's events from Google Calendar via the gog CLI — a Google Workspace tool I have wired into my workspace. Every event gets its time, name, and location if present. If the calendar is empty, it says so. No hallucinating fake events.
🏋️ WHOOP Recovery Data
I built a custom WHOOP skill for Hank earlier this month. The morning brief uses it to pull yesterday's recovery score and day strain (final values, not mid-day estimates) and today's sleep performance. If WHOOP hasn't finished processing overnight data yet, it skips gracefully instead of erroring.
What makes this useful beyond raw numbers: Hank knows my health context. I'm on a statin, which inhibits CoQ10 production. That matters specifically after heavy strength training — leg days in particular hit me with more DOMS than they otherwise would, and recovery scores in the days after tend to run suppressed as a result. A 52% recovery the morning after a hard leg session reads differently than a 52% recovery on a rest day. Hank knows the difference, and reads the numbers against my personal baseline rather than a generic one.
💰 GCP Cost Summary
I run experiments on Google Cloud, and cloud costs have a way of quietly accumulating. Every morning brief includes yesterday's spend by service and a month-to-date total, pulled directly from BigQuery billing export. If any single service spent more than $1, it gets flagged. It's a tiny budget gate that has caught runaway experiments more than once.
📰 AI / Tech News
Hank runs a few web searches — AI news, startup funding, tech headlines — and summarizes the top 3–5 stories with source links. This isn't curated or filtered through any RSS magic. It's just a model that knows what I care about, doing a quick scan and pulling signal from noise. Good enough for a morning digest; not a replacement for deep reading.
💡 Content Ideas for This Site
Every brief includes 2–3 content ideas for this site, each with a full draft outline or script. These get saved to a dated Obsidian note automatically — so even if I don't act on them today, they accumulate into a backlog I can pull from later. The brief just shows a one-line teaser and the note path.
✅ Tasks
Hank reads yesterday's and today's Obsidian daily notes and extracts anything that looks like a task — checkboxes, bullets tagged TODO, action items. They show up at the bottom of the brief as a quick "don't forget" list. Not a full task management system, just a surface-level scan that catches the obvious things.
State Tracking: heartbeat-state.json
The system tracks what's already been sent to avoid duplicates. A small JSON file — memory/heartbeat-state.json — records timestamps for the last morning brief, the last storm alert, and other one-per-day actions. Before sending anything, Hank checks this file. It's low-tech, but it works.
Quiet Hours
The system respects boundaries. No messages before 7 AM or after 9:30 PM on weekdays, 10 PM on weekends. If a heartbeat fires during quiet hours, Hank acknowledges it and goes back to sleep. The goal is ambient intelligence, not ambient noise.
What I'd Add Next
A few things on the backlog:
Job search digest — new listings matching my criteria, pulled from saved searches
GitHub activity summary — any PRs, CI failures, or stale branches across my repos
Stock/market summary for a watchlist (simple, not financial advice)
Weekly rollup — a Friday summary of the week's briefs, wins, and open threads
The Bigger Picture
What I've built here isn't particularly novel — people have been building morning dashboards and digest bots for years. What's different is the substrate. I'm not maintaining a cron script that hits a bunch of APIs. I have an assistant that understands my context — my health situation, my job search, my projects, my preferences — and applies that context to every piece of information it surfaces.
The configuration is just Markdown. Changing what the brief covers means editing a file, not touching code. That's the part that actually feels like the future.
Tools: OpenClaw · Telegram · wttr.in · Open-Meteo · Google Calendar · WHOOP · BigQuery · Obsidian
Originally published at https://www.paulbrennaman.me/lab/morning-intelligence-brief

