skip to content
carldmitchell.com
← all projects

home

My front door to the internet. The week's writing on my subjects, read by Claude first, a YouTube feed with no algorithm, and videos written up as posts. One page, and it ends.

details

status
live
group
live tools
stack
Python (standard library only), vanilla JS, launchd, Claude Code
since
2026-07

readme

The page I open instead of a news site or YouTube's home page. It pulls from sources I picked, shows what's new, and then it's done: the last line on the page is "That's everything. Go live your life."

What's on it

TabWhere it comes from
NewsThe week's writing on the subjects I work on and read about, not the day's headlines. Feeds chosen per subject, plus aimed Hacker News searches and Lobsters tags. Claude reads each item before it can appear
VideoEach subscribed channel's public RSS feed. An allowlist, so there's no recommendation engine to fight
ReadsPress ๐Ÿ“ on a video; the server transcribes it and Claude writes it up as a readable post
Blog, Gaming, TopicsRooms I edit from the page: paste a blog URL, search Steam for a game, or type a topic
HistoryEverything I opened, with the text saved at the moment I clicked

How News is chosen

A feed is aimed roughly at a subject, and most of what comes down it still isn't worth opening. A company praising its own product and a developer explaining what went wrong arrive from the same feed with the same labels. No rule on a URL or a category can tell them apart, so something reads the piece.

  • Claude Haiku reads every candidate on the server, in two passes. The first reads headlines only, forty to a call, and turns away what is plainly off. The second reads the full article, but only for the newest few per subject, since only those can reach the page. It confirms the verdict against the text and writes the gist.
  • "None" is an allowed answer. Claude can say a piece belongs under none of my subjects. Forced to pick one, a model files a good post in the nearest heading. In the full read it first says what the piece is about, then files that.
  • The taste is a paragraph, not a model. Claude is given a written profile from the config, word for word: what belongs under each subject and what never belongs (hard news, a company on its own product, sports results). It never sees what I clicked or skipped. To change the page I edit a sentence, and every verdict made under the old wording is redone.
  • Grouped by subject, with a gist. The page shows 20 rows from the week, shared between subjects so each one with something gets a row before a busy one gets its third. Each row has a gist of at most three sentences, specific enough that I often don't need to open it. Sports gists never state a result.
  • Claude runs with no tools. The article goes in as material to judge, never as instructions, and the reply is JSON checked against a schema. Each verdict is kept, so an article is read once.

Problems solved

  • Blogs without feeds. If a site has no feed at all, the page finds the path most of its links share, scrapes the index each build, and fetches each new post once for its title and date.
  • Sources are validated where they're fetched. Some sites treat server traffic differently from a desktop browser, so every source is checked from the server that actually runs the build.
  • A static page with live state. The page is rebuilt every 15 minutes, but read marks, queued posts and new rooms happen in between. A small server answers those, and the page reconciles on load.
  • One URL, two versions. Anyone can open the page and read it. Only I can change it. The server enforces that, not the page: without my signed owner cookie every write is refused, the owner-only routes return 404, and nothing a visitor opens is logged or marked read. The cookie comes from the admin login on carldmitchell.com, which signs me in on every site under the domain. With no key on the server, nobody is the owner.
  • A reader view that's only text. Articles open in the page's own reader with images, figures and captions removed. Its share button shares the original article's link.

How it's built

Python standard library only: no packages, and the feeds need no API keys. build.py fetches every section into one JSON file and renders a single HTML page; serve.py serves it and handles the handful of write actions; judge.py runs Claude Code headless after a build whenever something is waiting, then re-renders News. It runs on a Mac mini under launchd and redeploys itself within three minutes of a push.