LANVAR
← The shelf

arty's claude newsletter

Escaped the lab

A daily AI newsletter with zero servers and zero API bill: Python fetches the firehose, Claude judges it, and the inbox gets opinions — not summaries.

PythonClaudeGmail 2026
How it actually works
THE WIRE — RAW STORIES RUBRIC below threshold = gone THREAD A — CONTINUES THREAD B — NEW EMAILED ~7 AM PAST_ISSUES/ — ONE COMMIT A DAY TODAY one day, one loop — tomorrow's wire remembers today NOW score & discard cluster into threads draft & self-critique email the issue commit to the archive score → cluster → draft → email → commit
FIG 1 · one daily loop — nine stories in, four survive, one issue out
PYTHON — THE PLUMBING fetch.py sources.yml → raw stories dedupe vs state.json hashes candidates.json clean, fresh, unjudged CLAUDE — THE JUDGMENT standing orders interests · rubric · feedback + the last 7 issues score & discard one-line rationale each, below threshold = gone cluster into threads continue a running story or open a new one draft the issue takes, not summaries self-critique filler? disguised summaries? rewrite until it's honest email via Gmail lands ~7 AM git commit → past_issues/ the repo is the archive tomorrow remembers today ↺
FIG 2 · the machinery — deterministic plumbing on the left, judgment on the right
The story

The division of labour is strict: Python does everything deterministic, Claude does everything requiring judgment. A fetch script pulls candidate stories from a source list, dedupes them against everything already covered, and hands over a clean candidates file.

Claude then reads its standing orders — an interests file for taste, a rubric for scoring, a rolling feedback file that learns what to boost and drop, and the last seven issues for narrative continuity. It scores every candidate with a one-line rationale, discards ruthlessly, clusters the survivors into themes, and tracks which themes continue ongoing “threads” from previous issues.

The draft gets a self-critique pass — real takes or disguised summaries? filler? weak subject line? — and a rewrite before anything goes out. Then it emails the issue, commits it to git as the permanent archive, and updates state so tomorrow’s run knows what today already said. It runs every morning as a scheduled Claude Code routine: no server, no API bill, just quota.