How the Daily Brief gets written

, 6 min read

Contents

Every morning a short news brief goes up on this site before 7am. I don’t write it. Claude writes it from ten news feeds, and it goes live without anyone reading it first. There are just over 500 of them now, one for every day since 29 May 2025.

Why I built it

I built it for two reasons: to learn how to put something like this together, and to get a short digest of the news each morning. Before, I’d scroll X for a few headlines or open Google News. I still use both, but I enjoy reading the brief, and I can click through to any of the articles that catch my eye.

The prompt describes the reader as “a UK-based finance professional” who cares about UK economic policy, global macro, AI and tech that affects business, and big geopolitical shifts. In other words, roughly me.

How a brief gets made

  1. At 05:30 UTC a scheduled function on Netlify kicks off a GitHub Actions workflow. That’s 06:30 in summer and 05:30 in winter.
  2. A script pulls recent stories from ten RSS feeds: BBC News, The Guardian, the Financial Times, The Economist, City AM, Politico, TechCrunch, Ars Technica, Al Jazeera and Nikkei Asia. It keeps anything from the last 36 hours, drops near-duplicate headlines and stops at 40 articles.
  3. Each article gets a short ID, and the whole lot goes to Claude with a prompt. The prompt asks it to sound like “a colleague who has read the overnight papers and is catching you up over coffee”: UK news first, then global macro, then tech and AI, then geopolitics, in under 600 words and with no bullet points. It also says: “If nothing of consequence happened, say so in one line and stop.”
  4. Claude sends back the brief, the IDs of the articles it actually used, and three short headlines for the homepage.
  5. The script checks the reply, writes a Markdown file and commits it. Hugo builds the page and Netlify publishes it, normally within a couple of minutes.

What went wrong, and what I did about it

It hasn’t missed a day since it started. That turned out to be a low bar.

The first version ran on xAI’s Grok and wrote 1,900-word “intelligence briefs”, with an executive summary and a heading for every category. Thorough, but not something to read before breakfast. When I moved it to Claude in April 2026, the prompt switched to plain paragraphs and a 600-word limit.

Grok also once published its homework. The brief for 23 October 2025 opened with the model’s planning notes (“First, the structure I need to follow…”) instead of the brief. The script now looks for notes like that, along with headings, bullet points and bold text, before anything goes live. If it finds any, it sends the reply back to Claude once with a list of what was wrong. If the second attempt is still unusable, the brief is replaced with a plain list of headlines. I’ve since done the same to the 23 October one.

Then it got a date wrong. On Thursday 1 October 2026 the brief said US payroll figures were out “tomorrow, Friday 3rd October”. 3 October was a Saturday. The prompt had given it today’s date and nothing else, so it worked out the rest itself. Now the prompt includes the next seven days with their weekdays, in UK time, and the script checks every weekday and date in the brief against that list. A brief with a date problem still goes out, but I get an alert.

Meanwhile it was going up later and later. The workflow was scheduled on GitHub for 06:00 UTC, but GitHub starts scheduled jobs when it has spare capacity. In late 2025 runs started about 35 minutes late. By September 2026 the typical delay was over five hours, and one run in August started more than 12 hours late. The morning brief was going live around lunchtime. Even when it ran on time, 06:00 UTC is 7am in summer, so it was never going to be ready before 7am between March and October. The fix was to stop relying on GitHub’s clock. A scheduled function on Netlify now starts the workflow at 05:30 UTC, and GitHub’s own schedule stays as a backup that does nothing if the day’s brief already exists.

The sources list was padded too. It showed every article fetched, about 40, whether the brief used it or not. Claude now returns the IDs of the articles it used, in a fixed format the API enforces, and the list shows only those. That’s usually nine to eleven.

And one feed had quietly died. The Telegraph’s feed started returning a paywall error and contributed nothing for a while before I noticed. City AM replaced it.

If no brief is live by 8am UK time, or one falls back to the headline list, a GitHub issue lands in my inbox.

Each brief now says it was written automatically by Claude and published without editing. It seemed fairer to tell readers than to let them assume I’d checked it.

Choosing the model

The brief moved from Grok to Claude in April 2026, on Claude Sonnet 4.6. Rebuilding the pipeline seemed a good moment to try the newer Sonnet 5.5, so I gave both the same 39 articles.

Both passed every check first time and picked the same 11 sources. Where they differed was in how closely they followed the prompt. Sonnet 5.5 put UK stories first, as asked. Sonnet 4.6 led with bond markets. The prompt asks for one specific upcoming event at the end, or nothing: Sonnet 5.5 left it out, and Sonnet 4.6 ended on a vague list of things to watch. Sonnet 5.5 came in at 380 words, Sonnet 4.6 at 566.

The one that settled it was smaller. On a Conservative tax pledge, Sonnet 4.6 added that the party leader was “clearly betting it resonates with the squeezed-asset-rich voter”. Sonnet 5.5 reported the pledge and stopped. For something published under my name without anyone checking it, I’d rather it reported than guessed at motives. The brief has run on Sonnet 5.5 since 7 October 2026.

What it costs

The Claude API costs a few pence a day. The scheduling, the workflow and the hosting all fit in free plans.

It still gets things wrong. The obvious mistakes get caught before they go live now, and I hear about the rest. Today’s brief and the full archive are on the Briefs page.