Every morning I used to open the same seven tabs. Calendar. Email. Weather. Markets. News. It wasn’t a ritual. It was a chore. By the time I’d mentally assembled the picture of my day, I’d already spent fifteen minutes and forgotten half of what I’d seen.
I’m an SRE by trade, which means I spend a lot of time thinking about information density and reducing friction. At some point I started wondering: why am I the one assembling this dashboard manually, every single morning?
The Build
I’ve been building skills for Claude Code, which are modular instruction files that tell Claude how to handle specific tasks. Think of them like runbooks for AI: structured, repeatable, designed to produce consistent output. So I decided to build one for my morning.
The morning-brief skill pulls from a lot of places:
- My Microsoft 365 calendar, three days out, with automatic conflict detection
- Priority email, sorted by importance, each message summarized in one sentence
- Flagged action items and anything marked urgent in the last 48 hours
- Phoenix weather from the NWS API (free, no key required, solid data)
- S&P 500, NASDAQ, and the Dow, because context matters
- Five RSS feeds: AP News for national, The Hill for politics, AZCentral for local Phoenix, Yahoo Finance for markets, and Hacker News for the tech and SRE world I live in
- Culture and trending, a quick pulse on what the rest of the world is talking about
- A daily quote from ZenQuotes to close it out
The output is a single self-contained HTML file written to my Desktop. No external dependencies, no CDN links. Open it in any browser. Weather strip at the top, market tickers below that, then a tabbed meetings panel, email list, action items, and six news panels in a three-column grid.
I scheduled it to run automatically every morning at 7am via Claude Code’s remote trigger system. The agent wakes up in the cloud, gathers everything, writes the file, and emails it to me. I open my phone, tap the email, and I’m looking at my day before I’ve had coffee.
Then I Added History
Here’s where it got interesting. A few days in, I kept having the same thought: I know what’s happening today, but what happened on this exact date throughout history? Not in a trivia way, more of a grounding thing. Today is just another April 6th in an unbroken chain of April 6ths going back thousands of years.
So I added a section called “On This Day in History.” It pulls from Wikipedia’s On This Day REST API, which is free and requires no authentication. It returns 30 to 60 historical events for any given month and day. I built the selection logic to span at least 3,000 years: a couple of events from the ancient or classical world, a few from medieval and early modern history, some from the industrial age, and a handful from living memory.
There’s a small technical detail I liked: Wikipedia returns negative year integers for BCE dates. So -44 means 44 BCE. The skill converts those automatically. You see “44 BCE” in the panel, not a confusing negative number. It’s a small thing, but a dashboard is a communication tool, not a data dump.
The panel sits full-width below the news grid, displayed in two columns. Ten events. A blue year label on the left, the description on the right. Visually compact, but it carries weight.
This morning, reading it, I was reminded that on this exact date, something happened that changed the world. And something else. And something that’s mostly been forgotten but probably shouldn’t be. It puts the market numbers and unread emails in a different frame.
What the Stack Actually Looks Like
Deliberately boring, which is the point:
- WebFetch for RSS feeds, JSON APIs, and NWS weather
- WebSearch for market indices (Yahoo Finance blocks scrapers) and culture trending
- Microsoft 365 MCP for calendar and email access
- A single Write call at the end that produces the HTML
- Zapier’s M365 connector to email the finished brief to myself
No database. No server. No paid APIs. The whole thing runs on demand or on a schedule, produces a file, and disappears. When a feed goes down, the panel shows “Feed unavailable” and the brief still generates. When the NWS API is slow, it falls back to a web search. Nothing blocks the output.
Honestly, the Hardest Part Was the Prompt
The implementation itself, writing the skill, wiring up the fallbacks, building the HTML template, was straightforward. Claude Code handled the mechanics. I described what I wanted; it built, refined, and iterated. That part moved fast.
What actually mattered was the prompt.
Getting Claude to reliably produce a specific, structured output isn’t about being clever with your wording. It’s about being precise. What exactly should happen if the NWS API returns a 503? Which email fields should be included? What’s the exact HTML class name for a back-to-back meeting badge? Every decision you leave vague is a decision Claude makes for you, sometimes well, sometimes not.
The reason this skill works consistently is because I spent real time on the instructions before I wrote a single line of code. I used a technique I’ve been developing: a prompt-generating prompt. Feed it your goal, and it outputs a fully-structured Claude Code skill including routing logic, fallbacks, data mapping, and edge cases.
That’s a story for another day. The short version: Claude Code made the building easy. The thinking, knowing what you actually want and being willing to specify it, that’s still the work.
The Bigger Idea
What I’ve found is that structured skills like this are more reliable than freeform prompts. Not because Claude needs the structure, but because I do. Writing the skill forces me to think clearly about what I actually want. What should appear when there’s no data? What’s the fallback if an API is down? What order should things happen in?
That discipline produces better outputs, but more importantly it produces outputs I can trust. I open the brief knowing exactly what it contains and how it was assembled. No surprises, no gaps I’d care about.
The morning-brief is probably the most-used thing I’ve built with Claude Code. It runs quietly, costs nothing to operate, and gives me the one thing I didn’t realize I was missing: a single, coherent view of the day before it starts.