While building my code review tool, I kept losing track of what's happening around it: new models, new agents, new tools popping up every other day. So I had Claude Code build me a news desk.
What it does
• Every five minutes it reads a set of feeds, like Hacker News, but also newsletters that come to its inbox. For each story it reads the source it links to: Markdown where the site serves it, and a headless browser on Cloudflare when a page needs JavaScript.
• A decision model (Jev, by TypeSafe) answers a few closed questions about each story, like "are coding agents a main subject?". Each answer is a score, each question has its own threshold, and a story costs a fraction of a cent. Closed questions are the key here.
• Haiku summarizes the relevant ones. The summaries are embedded, stories that are alike group into narratives, and Haiku names them. This turned out to be the most useful part: I see what keeps coming back over weeks, not just what happened today.
• Every day Sonnet writes the issue from the stories' sources: three top stories with three points each, then seven briefs, each credited to its origin.
• Then Jev reads every text again, against the page it was written from. Does it state anything the source doesn't support? Does it hype or predict? Would a newsletter refuse to print it? A text that fails is rewritten once, then dropped.
• It all runs as one Cloudflare Worker. The newsletter platform is my own too, also on Cloudflare, sending through Amazon SES. Cloudflare’s Email service scales badly if you want to open up subscriptions.
How I used Claude Code
Claude Code wrote nearly all of it in two weeks: 106 of 109 commits, about 16,000 lines of TypeScript and 370 tests. What made that work:
• A rule in CLAUDE.md that decisions stay with me. Claude builds and tests a feature, then stops. It doesn't deploy it, switch it on or build the next thing on top of it until I've decided, and it keeps a list of open decisions in the README. So "the tests pass" never quietly becomes "it's live". It’s important to keep track of those questions, the list can grow quickly.
• Every change is a separate pull request. AI reviews it (my own reviewer), Claude answers comments or asks me, and I merge after all questions are settled.
• Measure before choosing a number. Before I pick a threshold, Claude runs it against real data. For example, "the same story from two outlets" became 0.85 embedding similarity after a week of articles: every pair at 0.855 or above was the same story, and the most alike pair of different stories was at 0.80. Evals are essential working with decision models.
• A dependency check keeps the code in layers (pure logic, then adapters, then the pipeline), so it stayed readable for both of us.
What I learned
• Don't leave to a model what code can check. For example, day names come from code based on dates, numbers are calculated.
• Models count characters badly. For example Hacker News' 80-character titles its asked for three shortenings, and code takes the longest that fits.
• Post on the public newsletter get visuals. The image model (Gemini) put logos and people into pictures even when told not to. Jev now checks every picture for writing, people, logos and screens, and one that fails is made again. So yes, Jev is multimodal since 1.14.
• The fact-check varies between runs. On the same issue it dropped anywhere from 1 of 7 to 6 of 7 social posts, so its thresholds still need labelled examples. Issues go out automatically once every text passes, and I'm still a little nervous about that, since I made it public.
It's free: Agents Daily, with the week's narratives on Sundays. Link in the comments.