Weekly briefing
An automated Saturday email with AI news, new software releases and a ranked list of local events.

What it is
I built this with Claude Code to summarize the newsletters I already receive in one email every Saturday morning. It opens with bullets I can scan on my phone. Claude Code clusters overlapping stories, scores them and groups them into themes, notable stories and quick hits. Roughly two thirds is AI, with stricter inclusion criteria for business and industry stories.
The briefing also covers what the community argued about (Hacker News, Techmeme, an AI Twitter recap) and what practitioners adopted (GitHub Trending). The useful items are where those disagree with the announcements. Claude Code relates the news to what I'm building and the product work I lead, then ranks Seattle AI and product events, separating the next three weeks from the rest.
How it runs
On my Mac, launchd starts a shell runner at five in the morning on Saturday, or at the next wake if the Mac was asleep. The runner executes three stages: pull, synthesize and send. A Python helper fetches the last seven days of newsletters over IMAP into JSON files.
A headless Claude Code session reads those files, fetches newsletter web archives and underlying articles, and writes the email as HTML under a hard time limit. The session has no shell or mailbox access. The runner removes the mail credential from the session's environment before starting it, so the mailbox restriction does not depend on the tool list. The runner then checks the header's date, sends the email over SMTP and commits the HTML to the repo.
What it got wrong
The first version summarized newsletters from the mailbox, where links get stripped, so the model guessed at URLs that did not exist. Now it summarizes their web archives.
The model got the day of the week wrong in the header. The runner now stamps the date when a run starts and blocks any email whose header does not match.
The model reads untrusted newsletter text and can write inside the repo, so a prompt injection could rewrite the runner that launchd executes the following week. The runner now checksums its own files before the model stage and blocks the send if they changed.
Status
It has been live since July 2026, one email a week, archived in the repo. I add newsletters through a mail filter without changing code.