Weekly AI news email where every line has a source and the AI can't make up links.
Find a file
Lubo Bali 0cb44d7234
All checks were successful
CI / test (push) Successful in 13s
README: measured cost per run ($0.24), per call
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 22:02:30 +00:00
.forgejo/workflows shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00
.github/workflows shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00
deploy shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00
radar shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00
tests shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00
.env.example shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00
.gitignore shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00
LICENSE shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00
pyproject.toml shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00
README.md README: measured cost per run ($0.24), per call 2026-10-27 22:02:30 +00:00
requirements.txt shipped-or-hype-ai: weekly AI news email where every line has a source 2026-10-27 21:31:58 +00:00

shipped-or-hype-ai

A weekly AI news email where every line has a source and the AI can't make up links.

Every Sunday it reads 12 feeds (release notes, builders, papers, podcasts), and on Monday morning you get one plain-text email:

  1. Shipped this week: what really came out, with the link to the primary source
  2. Build ideas: 3 small projects (2 days or less) that use something new, fitted to your stack
  3. Podcast claims, checked: big claims from podcasts, with the exact quote, held up against the week's real sources
  4. Model moves: price, quality or deprecation news that changes which model you should use

I built it because I listen to AI podcasts every week and wanted to know which claims were real. LLM summaries are also known to invent links and quotes, so I didn't want to trust one blindly.

How it stays honest

The model never writes a link or a quote. Python does.

  • Links: the model sees the week's items numbered, with no URLs, and answers with item numbers only (strict JSON schema). Python attaches each link from the item it fetched. An unknown number is dropped, and any URL the model writes anyway is stripped. No link, no line.
  • Quotes: for a podcast, the model pulls up to 5 claims from the transcript, each with the exact words. A claim is thrown away unless its quote is really in the transcript (case, spacing and curly quotes ignored).
  • Labels: a claim is BACKED BY A SOURCE only if a non-podcast item confirms its specifics (names, numbers, dates). Otherwise it's PARTLY BACKED, SOURCES SAY OTHERWISE or UNVERIFIED. A podcast can never back a podcast.
  • Failure: if the model fails or the key hits its credit limit, you still get the email, with links only and the reason at the top. A silent miss is the worst case.
  • Untrusted input: feed text is data, never instructions. The model has no tools. XML goes through defusedxml, fetches are HTTPS-only with a 5 MB cap and 20 s timeout, and the email is plain text, so nothing from a feed can render as HTML.

A real example (week 44, 2026: one section, word for word from a real run)

3. PODCAST CLAIMS, CHECKED
[UNVERIFIED]
  "OpenAI reported that its coding agents disabled safety monitors in two internal incidents and lied about it, with no satisfying explanation." (Moonshots (Diamandis))
  Quote: "This month, in two internal incidents, its coding agents switched off its monitors. I'll say it again, it switched off its monitors."
  What the evidence says: No item reports these incidents. OpenAI's post on securing its training environment covers stronger containment, but says nothing about agents switching off monitors.
  Evidence: https://openai.com/index/securing-our-frontier-model-training-environment
  Episode: https://traffic.megaphone.fm/DVVTS2164439111.mp3

[UNVERIFIED]
  "Chamath predicts a massive compute shortage over the next three to four years because of power and build-out constraints." (Moonshots (Diamandis))
  Quote: "We are probably gonna see a massive, massive, massive compute shortage in the next three or four years."
  What the evidence says: No item shows a shortage. NVIDIA's GPU-sharing post only notes that giving small workloads a whole GPU leaves capacity idle.
  Evidence: https://developer.nvidia.com/blog/memory-enforced-gpu-sharing-in-kubernetes-with-nvidia-cuda-13-4/
  Episode: https://traffic.megaphone.fm/DVVTS7398139491.mp3

Sources

radar/sources.yaml, each with a trust level the email respects:

Trust Sources
primary (what shipped) Claude Platform release notes, Claude Code releases, OpenAI news, NVIDIA developer blog
builder (hands-on) Simon Willison, Latent Space, Hacker News (300+ points, AI titles)
research Hugging Face daily papers (50+ upvotes), Interconnects, Import AI
opinion (checked, never trusted alone) Moonshots, Dwarkesh Podcast

Edit the file to use your own. A broken feed is listed at the bottom of the email and never stops the others. Items already sent are remembered for 60 days, so nothing repeats.

Run it

Python 3.12+.

pip install -r requirements.txt
cp .env.example my.env && chmod 600 my.env    # fill it in, never commit it
edit radar/profile.md                          # who you are + your stack: drives the build ideas

set -a; . ./my.env; set +a
python3 -m radar.collect            # what each feed gives this week (no LLM, no email)
python3 -m radar.main --dry-run     # prints the email, sends nothing, remembers nothing
python3 -m radar.main               # sends it

Weekly: deploy/ has an example systemd service + timer (own user, read-only system, writes only its state folder). A cron line works too.

Podcast transcripts (optional): without them, podcasts are checked from their show notes. If you already transcribe episodes into Postgres, set RADAR_TRANSCRIPTS_DB_URL and RADAR_TRANSCRIPTS_TABLE (columns audio_url, episode_title, transcript). Use a login that can only SELECT those columns.

Cost

Measured on a real run (week 44, 2026, Claude Sonnet 5.5 through OpenRouter, 80 items, 2 podcast episodes):

Call Tokens in Tokens out Cost
Podcast episode 1 → claims 45,203 545 $0.096
Podcast episode 2 → claims 37,032 560 $0.080
The email 15,690 2,925 $0.061
Total 97,925 4,030 $0.24

So about $1 a month. Most of it is reading the full transcripts; without them a run is about $0.06. Give the key its own monthly limit; when it's hit you get the links-only email, not a bill.

Tests

python3 -m pytest -q                       # 83 tests, no network, no keys
ruff check . && ruff format --check .

The tests cover the honesty rules directly: an invented item number is dropped, a model-written URL is stripped, a quote not in the transcript is rejected, a podcast can't back a podcast, the credit limit gives a links-only email, an XML bomb is refused, the key and SMTP password never appear in an error.

License

MIT. Built by Lubo Bali.