A twice-weekly AI news newsletter, generated by Claude, delivered by Gmail,
archived on GitHub Pages. Runs automatically every Sunday and Wednesday
at 13:00 UTC via GitHub Actions.
The editorial brief: synthesize trends and themes (not article lists),
always link out for going deeper, and never miss big new techniques, tools,
workflows, or mental models.
fetch (RSS / Reddit / GitHub Trending / RSSHub)
→ dedupe against data/seen.json
→ synthesize one edition with Claude Opus 4.8
→ publish docs/editions/<date>.html + update docs/index.html + docs/feed.xml
→ email via Gmail SMTP
→ commit docs/ + data/ back to main
$7 (MAX_RUN_COST_USD inSITE_BASE_URL to be set (already the case in CI);In GitHub → Settings → Secrets and variables → Actions, add:
| Secret | Value |
|---|---|
ANTHROPIC_API_KEY |
Your Anthropic API key |
GMAIL_ADDRESS |
The Gmail account that sends the email |
GMAIL_APP_PASSWORD |
A Gmail app password (see below) |
RECIPIENT_EMAIL |
Where to deliver (can be the same Gmail address) |
Gmail app password: requires 2-Step Verification on the Google account.
Go to https://myaccount.google.com/apppasswords, create one named
“ai-update”, and paste the 16-character password into the secret. Regular
account passwords do not work with SMTP.
GitHub → Settings → Pages → Source: Deploy from a branch, branch
main, folder /docs. The site will be at
https://<user>.github.io/ai-update/.
Trigger manually: Actions → Newsletter → Run workflow (optionally with
“publish only, skip the email” checked for a test run).
pip install -r requirements.txt
export ANTHROPIC_API_KEY=...
export GMAIL_ADDRESS=... GMAIL_APP_PASSWORD=... RECIPIENT_EMAIL=...
python -m newsletter.main --dry-run # fetch + dedupe only, no API call
python -m newsletter.main --no-email # full run, publish but don't email
python -m newsletter.main # the real thing
0 13 * * 0,3 = Sun/Wed 13:00 UTC).MAX_TOTAL_ITEMS, MAX_SUMMARY_CHARS, MAX_RUN_COST_USD