โ† Portfolio

The Daily Brief

An open-source morning briefing pipeline โ€” researched, synthesised, narrated, and delivered to your inbox before you wake up. Fork it, set your secrets, and it runs.

The Problem

Keeping up with the news takes more of the morning than it should โ€” and still leaves you feeling behind.

The Economist, NYT, BBC, TechCrunch, AI newsletters, podcasts โ€” all in different apps, different inboxes, different formats. The signal is buried in the noise, and by the time you've pieced something together, half the morning is gone.

This pipeline produces the alternative: a single briefing, structured by topic, sourced only from outlets you choose, deep enough to leave you genuinely informed, and waiting before you're out the door.

What Lands In Your Inbox

At 5am local time, an email arrives. It contains:

๐ŸŒค Weather

Today's high, current conditions, and a clothing recommendation for two locations โ€” home and work by default โ€” so you know what to wear before you leave the house.

๐Ÿ“ฐ Categorised News

The example set ships as World & Politics ยท India ยท Tech & AI ยท Business & Finance ยท Science & Health ยท Sports โ€” categories and sources are yours to redefine in config.json. Several stories per section, with real summaries rather than headlines, and a "Why it matters" note on the top stories.

๐Ÿ” Explore

A rotating discovery section that pulls from a separate pool of sources outside your daily rotation โ€” WIRED, MIT Technology Review, Quanta Magazine, Hacker News, Aeon and more in the shipped config โ€” so you aren't reading the same perspectives every day.

๐ŸŽ™ Deep Dive

An optional persistent backlog โ€” one longform read and one podcast episode, each with a day counter showing how long it has been queued, plus what you're currently reading and listening to. A nudge appears after day seven. The queue is personal data, so it is read from a private store you point at with an environment variable; leave it unset and the section is simply omitted.

๐ŸŽง Audio

The whole brief is narrated and delivered as an MP3, linked directly in the email โ€” for the mornings when listening beats reading. Optional: skip the Deepgram key and you get a text-only brief.

How It Works

A Python pipeline runs on GitHub Actions. No server, no database, no ongoing maintenance.

It's travel-aware: point it at a calendar ICS feed and it detects multi-day trips, works out the destination timezone, and shifts delivery to 5am local time wherever you are (the hour is a constant in the generator, not a setting). Update your calendar and it adjusts โ€” nothing to change in the repo.

1 ยท Search

Claude uses live web search to gather the day's top stories across your categories, restricted to the outlets on your allowlist and held to a per-section word budget.

2 ยท Synthesise

Claude cross-references stories across sources and writes substantive summaries, not headline rewrites. Sources you mark as subscriptions carry more weight. A post-synthesis validation layer then catches cross-section duplicates, meta-items, hallucinated sources, and explore stories without real URLs โ€” code-level guardrails that hold regardless of whether the model followed the prompt.

3 ยท Narrate

The brief is converted to a natural spoken script and sent to Deepgram's text-to-speech API, which produces the MP3 in your chosen voice. The audio covers the news sections and the Explore segment โ€” Deep Dive links stay email-only.

4 ยท Deliver

An HTML email is generated and sent via Resend. The HTML and MP3 are committed back to your repository so the email can link the audio directly, then removed by a 7-day retention step so the archive can't grow without bound. The Deep Dive section is stripped from the committed copy โ€” it reaches your inbox and never the archive.

Expect roughly $1.00โ€“1.15 per run at the default 10-minute reading budget โ€” about $30โ€“35 a month running daily. That is almost entirely Anthropic API usage, dominated by the web searches and the tokens their results carry; Deepgram and Resend cost pennies. GitHub Actions is free on public repositories and metered on private ones.

Getting It Running

Five steps, no infrastructure to provision:

1 ยท Fork

Fork the repository to your own account. Nothing personal is committed anywhere in it โ€” recipient, sender domain, weather locations and calendar all arrive through Actions secrets; the reading queue is read from a private store you mount, and the section stays empty without one.

2 ยท Add secrets

Only ANTHROPIC_API_KEY is required. Email delivery, audio, weather and calendar keys are all optional, and each feature degrades gracefully when its key is missing.

3 ยท Edit the config

One config.json holds your sources, categories and word budget. Everything else is environment variables.

4 ยท Dry run

Trigger the workflow manually with dry run enabled: full generation, but no email, no audio and no commits. The output lands as a run artifact so you can read the brief before anyone else does.

5 ยท Go live

Uncomment the schedule: block in the workflow. It then runs hourly and delivers only at 5am local time โ€” scheduled runs ship disabled so a fresh fork can't email anyone by accident.

Guard Rails

A news pipeline reads your calendar, writes to your repo and sends mail on your behalf. The template treats that as a privacy surface rather than an afterthought:

  • PII scanning on every push โ€” a CI workflow scans each commit for email, phone and SSN-shaped strings, with masked output. The repo is public; every committed byte is published.
  • Fails closed on personal data โ€” if the private store holding your reading queue is unset or unreachable, the Deep Dive section is omitted with a warning. It is never guessed at, and the queue is never tracked in the repo.
  • Honest dry runs โ€” dry-run artifacts contain your personal sections, and the workflow says so rather than printing them into the run log.
  • 45 tests in CI โ€” the prose linter and regression suites run on every push and pull request. Both are offline and key-free, so they run safely on fork PRs too.
  • MIT licensed โ€” fork it, change it, ship it. Third-party attributions are in NOTICE.

Under the Hood

For the engineers โ€” the full stack, openly published:

  • Claude API โ€” Sonnet 4.5 for story gathering and synthesis; Haiku 4.5 for the narration script, since converting finished prose to speech text is mechanical and costs a fraction as much
  • Quality layer โ€” an AI-prose linter, a reading-time word budget allocated by section weight, and a rolling coverage log that suppresses repeats and lets today's brief correct yesterday's
  • Deepgram Aura โ€” text-to-speech audio generation with configurable voice; MP3 linked in the email
  • Resend โ€” transactional email delivery
  • GitHub Actions โ€” scheduled automation, HTML and MP3 storage, and 7-day cleanup
  • Python โ€” the pipeline that ties it all together, with no server and no database anywhere in it

Want your own?

The full source is on GitHub under MIT. Fork it, add one API key, and dry-run it โ€” the README walks through the rest.

View on GitHub โ†’