Projects · Podcast · new episode every morning

Dutch Daily Briefing

A two-host English podcast about Dutch news that I built for myself. A chain of AI steps picks the stories, writes them up, checks the facts and records the episode before I wake up.

Dutch Daily Briefing cover art

Sample episode: Peak-Hour Power, Grounded Planes and Rabbits to the Rescue

Friday 9 October 2026 · 14 min · generated end to end, unedited

What's in this episode
  1. Grid fees that depend on when you use power
  2. KLM cuts flights for the winter
  3. A cooling housing market
  4. A fire under Amsterdam's Olympic Stadium
  5. Drought cracking Dutch foundations
  6. Rabbits and Rotterdam's permit freeze
  7. The hack at the prosecution service
  8. The Van Gogh Museum's truce with The Hague
  9. The top Dutch TV award
  10. Weekend ideas in Amsterdam
  • Dailysince September 2026
  • $0cost on a normal day
  • ~14 minper episode, 6 to 9 stories
  • 3voice providers, two of them backups

The problem I had

I was used to keeping up with US news through podcasts. After I moved to Amsterdam I looked for one that would do the same for the Netherlands, and the ones I found were mostly in Dutch or German. I wanted something to listen to in the morning that also explained the background I’m missing: who this minister is, why a court ruling keeps coming up, what a works council does.

So I figured I might as well try to build my own. I’m pretty happy with how it went. I listen to it most mornings.

How I went about it

I wanted two hosts talking, not one voice reading headlines. With two hosts, one of them can ask the question I’d ask (“wait, why does the Senate matter here?”) and the other can answer it.

The pipeline writes a full English briefing from the complete articles first, and only then turns that into a script, so the script is based on more than a feed summary.

How it works

  1. CollectNews feeds from five outlets (NOS, NU.nl, Het Parool, NL Times, DutchNews), minus anything the last two episodes covered.
  2. SelectAn AI model picks 6 to 9 stories and marks each as hard news or light.
  3. BriefIt writes an English briefing from the full articles and lists what it couldn't confirm.
  4. CheckOne web lookup per story, all at once. If a lookup fails, the story runs as written. More on this step.
  5. What's onA few things to do in Amsterdam, picked from the city's cultural calendar.
  6. Plan and scriptEach story gets a word budget, then the two-host script is written to fit.
  7. VoiceText-to-speech with both hosts in one recording, and two layers of backup.
  8. PublishThe audio and the briefing go out to a private podcast feed on my phone.

It’s about 1,500 lines of Python and a dozen prompt files, and it runs on GitHub Actions early every morning.

I set it up to cost nothing on a normal day. The writing runs on a Claude subscription I already pay for, and the voices have two layers of backup:

Normal dayGemini, free tier

Both hosts in one recording. Costs nothing.

If a part failsPaid backup, same voices

Only the failed part is redone. About $0.25 if it had to do a whole episode.

If that fails tooFree Microsoft voices

They finish the episode, and the episode notes say so.

What I changed after listening

Most of what I changed after launch came from listening to an episode and being annoyed by something:

Too much politics

I generated three versions of the same day with different amounts of lighter news and listened to all three. I settled on two or three lighter stories at the end, with politics capped at about three.

Episodes ran long

A word limit per type of story made every light story the shortest one, even when it was the best. Now a planning step divides a fixed number of words between the stories based on how much each has to say.

Yesterday's news again

One episode re-told the previous day's stories. Now the pipeline reads the last two days' briefings, and a story only comes back if something new happened.

Vague where the facts were thin

The writing step now lists what it couldn't confirm, and a fact-checking step looks those up before the script is written. I wrote up how that works.

Nothing about the weekend

After launch I added a short "What's on in Amsterdam" segment at the end. It kept recommending the same things, so now it remembers its recent picks, and on Fridays it covers the whole weekend.

A big local story got buried

A fire at the Olympic Stadium ran fourth. Forcing Amsterdam events into the top three messed up the running order, so the version I kept only guarantees they're in the episode.

I also looked at paying for a different voice provider and decided against it. I wrote that up separately.

How it’s worked out

It has put out an episode every day since I launched it. The only morning it didn’t finish by itself was in the first week, when the voice service hung and the job ran out of time. I re-ran it by hand and then added timeouts so the backup takes over.

Two problems had nothing to do with AI. GitHub’s built-in scheduler never ran my job, not once, so a free outside service triggers it every morning. And Apple Podcasts refused to play the episodes until I changed where the audio files are hosted.

What I learned and where it could go

The voices still aren’t perfect. About once an episode a line comes out in the wrong host’s voice, so it sounds like someone asking and answering their own question. I wrote a script that transcribes an episode and checks who said what, but I haven’t built an automatic fix, because re-recording costs time and free requests.

Almost none of the code is specific to Dutch news. A friend wants a daily briefing on New York theater, so the next step is to make that a second show on the same pipeline.

Last updated 11 October 2026.Code on GitHub