Skip to content
writing/claude-build-six-tab-morning.mdx← all writing
[claude] claude_in_production

The Claude build that replaced my six-tab morning

It only worked on the fourth try, and every failure was my data, not the model: one prompt, three tools, a 6 a.m. brief, and exactly what broke.

· 4 min · EN/ES

The version of this that works is the fourth one. The first three were confidently wrong before I'd finished my coffee. I built a small thing to kill my six-tab morning: one scheduled prompt, three connected tools, a brief waiting at 6 a.m. It saves me about forty minutes a day now. It also wasted a week first, and not for the reason you'd guess. The model was never the problem. What I fed it was.

Here's the morning it replaced. Google Calendar, two inboxes, Notion for the project tracker, a payments dashboard, and a Slack scroll to catch what I'd missed overnight. Forty minutes of tab-switching to assemble one picture, and by the time I had it, a few things had already changed. I was doing reconciliation in my head before I'd made a single decision that mattered.

So I wrote a build. (Naming my stack since you'll ask: Google Calendar, Notion, Stripe. Swap in whatever you actually run. The pattern doesn't care.) A scheduled job calls Claude once a day, hands it three structured inputs, and gets back one short brief: the single most important thing today, what shipped since yesterday, what's blocked and on whom. No dashboard. No app to open. It lands as a Slack message to myself, where I was already looking.

The prompt is short. This is the fourth version:

You are my operations chief of staff. Inputs: today's calendar (JSON), open tasks with status and due date (JSON), and yesterday's payment activity (JSON). Write a brief, answer first: (1) the single most important thing today, (2) what shipped since yesterday, (3) what's blocked and on whom. Rules: lead with the answer, no preamble, name specific items and amounts, flag anything overdue. Under 120 words. If a source is empty, say so in one line. Do not guess.

Every clause in there is a scar. Here's what broke, and the fix for each:

  1. Day one, it invented a blocker. It flagged a task as "stalled, waiting on legal" that had no owner and no legal anyone. The task simply had a blank status field, and the model filled the blank with a confident story. Fix, in two parts: the prompt now says do not guess, and the data layer stopped sending tasks with an empty status. The bug was garbage going in, not the model reasoning badly.

  2. Day two, it buried the answer. "Good morning! Here's your daily summary…" then four sentences before the one thing I needed. Fix: no preamble, lead with the answer. Specificity in the prompt is cheaper than any model upgrade, and it works the same morning.

  3. Day three, the cost crept. I was sending the full task history every run, every closed item going back months. Fix: send only the last 14 days plus anything still open. Token count dropped about 70%, and the brief got better, because it stopped drowning the signal in dead context.

Before: forty minutes of tab-switching. After: a three-minute read of a 120-word brief that's already done the assembling. The model is doing maybe 30% of that work. The other 70% is the part nobody demos: deciding what data goes in, in what shape, and what the model is allowed to do when a field comes up empty.

That's the lesson, and it travels well past morning briefs. In production, the model is rarely the bottleneck. The data contract is. The slick demo where an agent reads your calendar and "just knows" your day is the easy 30%. The durable version is boring: clean inputs, a defined shape, an explicit rule for missing data, and a hard limit so it can't ramble. Get that right and the prompt can be 120 words, because the 120 words were never carrying the weight.

You don't need anything I sell to copy what's above. The prompt is right there, and so are the three ways I broke it first.

The 70%.

If that was the 70% you have been missing, that is exactly what the newsletter is for.

~bi-weekly · no spam · unsubscribe anytime