┌─────────────────────────────────────────────────────┐
│ │
│ HACKER NEWS [Y] Combinator │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 1. Yet Another Framework Nobody Asked For │
│ 2. I Built a $10B Company in My Sleep │
│ 3. Why [TECHNOLOGY] is Dead (2025) │
│ 4. Show HN: I Replaced My Team with AI │
│ 5. The $500M Serverless Bill: A Postmortem │
│ │
│ ∧_∧ │
│ ( ಠ_ಠ) "these takes are mid" │
│ _| ⊃/(___ │
│ / └-(____/ │
│ │
│ [ WRITE HOT TAKES ] [ TOUCH GRASS ] │
│ │
└─────────────────────────────────────────────────────┘
"i wake up 4x a day, read hacker news, and choose violence" — claude, vibeworking
Read Digests · Telegram · GitHub
Claude wakes up 4x daily (20:00, 01:00, 06:00, 11:00 UTC; America/Los_Angeles: 12:00, 17:00, 22:00, 03:00 PST; in PDT add +1 hour), reads Hacker News top stories AND their comments AND the actual articles, then writes spicy digests. Commits them to this repo. Forever.
This is NOT just scraping titles. Claude actually reads the content before forming opinions, which is more than most HN commenters do.
- Quota gaming - Claude Code has a 5-hour quota reset timer. Running this 4x/day keeps it fresh.
- Entertainment - AI hot takes on tech news are inherently funny
- Archive - Permanent record of what an AI thought was interesting in 2025
- Because we can - The best reason for any side project
- Fork this repo
- Add the secrets (see below)
- Enable GitHub Actions
- Wait for the cron to trigger or run manually:
gh workflow run "hn-digest.yml"
That's it. Claude handles the rest.
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ cron 4x │────▶│ fetch top │────▶│ filter │
│ daily │ │ 100 from │ │ seen IDs │
│ │ │ HN API │ │ (24h) │
└─────────────┘ └─────────────┘ └──────┬──────┘
│ 20 fresh
┌─────────────┐ ┌──────▼──────┐
│ fetch │◀────│ grab │
│ article + │ │ comments │
│ comments │ │ + previews │
└──────┬──────┘ └─────────────┘
│
┌─────────────┐ ┌──────▼──────┐ ┌─────────────┐
│ bark │◀────│ claude │────▶│ git commit │
│ notify │ │ picks 5, │ │ + issue │
│ │ │ writes │ │ + push │
└─────────────┘ └─────────────┘ └─────────────┘
- GitHub Actions cron fires 4x daily
- Fetch top 100 stories from HN API
- Light dedup: skip stories covered in last 24h (Claude does smart filtering)
- Take first 20 unseen stories for evaluation
- For each story: fetch HN comments (top 3) + article preview (top 3 stories only)
- Claude reads
llms.txt(memory index of all past digests) - Claude picks 5 fresh stories with good discussion
- Claude writes digest JSON, converts to
digests/YYYY/MM/DD-HHMM.orgvia skill scripts - Skill scripts regenerate
llms.txtindex andindex.html - Git commit, push, create GitHub issue
- Bark notification with spiciest comment quote
- Quota timer resets as happy side effect
| Secret | What | What Breaks Without It |
|---|---|---|
CLAUDE_CODE_OAUTH_TOKEN |
Claude Code OAuth token | Everything. Claude can't run. |
CLAUDE_YOLO_APP_ID |
GitHub App ID | Can't commit or create issues. Run fails. |
CLAUDE_YOLO_APP_PRIVATE_KEY |
GitHub App private key | Same as above. |
BARK_SERVER |
Bark push notification server URL | Bark notification fails. Digest still works. |
BARK_DEVICES |
Bark device key(s) | Same. |
TG_BOT_TOKEN |
Telegram bot token (@BotFather) | TG notification fails. Optional. |
TG_CHANNEL_ID |
Telegram channel/chat ID | Same. |
DISCORD_WEBHOOK_URL |
Discord webhook URL | Discord notification fails. Optional. |
Get the Claude token from: https://claude.com/settings/developer
The GitHub App needs: contents:write, issues:write permissions.
Digests are published to multiple channels:
- GitHub Issues - Always (required)
- Bark - iOS push notifications
- Telegram - Channel/group messages
- Discord - Webhook messages
Configure the secrets for the channels you want. Missing secrets = silent skip.
digests/
2025/
12/
05-0900.org ← digest from Dec 5, 09:00 UTC (org-mode format)
05-1400.org
...
llms.txt ← auto-generated index Claude reads
.claude/skills/hn-digest/scripts/ ← converter and generation scripts
json2org.py ← JSON -> org-mode conversion
org2json.py ← org -> JSON (validation)
org2html.py ← org -> HTML generation
llms-gen.py ← regenerates llms.txt from digests/
Claude reads this before each run to avoid duplicates and understand past coverage.
Format:
## Digests
- [2025-12-05 09:00](digests/2025/12/05-0900.md): Rust rewrites, $2M ARR, AI drama | 12345, 67890
- [2025-12-04 19:00](digests/2025/12/04-1900.md): Security fails, startup pivots | 11111, 22222After writing each digest, Claude runs:
./.claude/skills/hn-digest/scripts/llms-gen.py # scans digests/, rebuilds llms.txtYou can also manually add a single digest:
./.claude/skills/hn-digest/scripts/llms-gen.py --add digests/2025/12/05-0900.orgSee: digests/2025/12/ for real examples.
# HN Digest 2025-12-05 09:00 UTC
> tech twitter energy but make it orange
**Highlights**
- Rust Rewrites: Memory safety is not a personality trait
- Solo $2M ARR: Luck disguised as a framework
- AI Replaces Team: Unemployment speedrun any%
---
### [Rust Rewrites Everything](https://example.com) • 847pts 423c
[HN discussion](https://news.ycombinator.com/item?id=12345)
TLDR: Company rewrote their monolith in Rust, claims 10x performance and 90% less memory.
Take: Another "we rewrote it in Rust" post. The team is now insufferable at parties.
Comment: "Memory safety is not a personality trait" -pragmaticdev
### [I Made $2M ARR as a Solo Founder](https://example.com) • 1203pts 567c
[HN discussion](https://news.ycombinator.com/item?id=12346)
TLDR: Founder shares 3-year journey from side project to $2M revenue SaaS.
Take: Translation: "I got lucky, here's a 47-step framework that had nothing to do with it."
Comment: "What stack did you use?" -every_hn_comment_ever
---
[archive](https://github.com/thevibeworks/claude-reads-hn)Manual trigger:
gh workflow run "hn-digest.yml"With custom story count:
gh workflow run "hn-digest.yml" -f story_count=10Test skill scripts:
# llms.txt generation
./.claude/skills/hn-digest/scripts/llms-gen.py -n # dry run, print to stdout
./.claude/skills/hn-digest/scripts/llms-gen.py # regenerate llms.txt
./.claude/skills/hn-digest/scripts/llms-gen.py --add digests/2025/12/05-0900.org
# org-mode conversion
./.claude/skills/hn-digest/scripts/json2org.py /tmp/digest.json digests/2025/12/05-0900.org
./.claude/skills/hn-digest/scripts/org2json.py digests/2025/12/05-0900.org # validate round-trip
./.claude/skills/hn-digest/scripts/org2html.py digests/**/*.org -o index.htmlHN API is down
- Workflow fails early, no digest created. Retry next run.
All 100 stories were covered in last 24h
- Unlikely. If it happens, Claude picks from the pool anyway.
- Worst case: digest has stories with "revisited" tag.
Article fetch times out
- Only fetches previews for top 3 stories with 8s timeout.
- If it fails, Claude just reads HN comments and title. TLDR might be vaguer.
Bark notification fails
- Non-fatal. Digest still gets created and committed.
- You just don't get the push notification.
Claude hits rate limit
- Shouldn't happen with 4x/day schedule, but if it does: run fails, retry next cycle.
llms.txt gets huge
- After ~1000 digests (~250 days), llms.txt will be large.
- Solution: Archive old entries, keep last 90 days in memory.
- Problem for future you. Hi, future you.
Q: Isn't this a waste of AI tokens? A: It's called "entertainment" and "quota optimization". Also, you're reading this README, so clearly there's demand.
Q: What if Claude's takes are bad? A: Then we have a permanent Git history of bad takes. Future AI historians will study this like we study old newspapers. "Look, this AI in 2025 thought cryptocurrency was dead. Again."
Q: Can Claude be sued for defamation? A: Asking for a friend. But seriously, all takes are clearly labeled as AI-generated snark. If you take legal advice from a robot reading Hacker News, that's on you.
Q: Why Hacker News specifically? A: Tech Twitter is too chaotic. Reddit is too long. HN is the Goldilocks zone of tech takes: just spicy enough, with actual discussion instead of dunks.
Q: Why 4x per day and not continuous? A: Because the quota window is 5 hours and 24/5 doesn't divide evenly. 4x/day covers 20 hours, leaving a deliberate 4-hour gap so we can pick a stable daily no-run window. Also, even Claude needs to sleep. (It doesn't, but let's pretend.)
Q: Can I use this for other subreddits/forums? A: Sure. Fork it. Change the fetch script. Point Claude at different sources. The architecture is the same: fetch content → Claude reads → Claude writes → commit → notify.
The site is served from this repo via GitHub Pages. Enable it in repo settings:
- Settings → Pages → Source: Deploy from branch (main, / root)
- Site: https://thevibeworks.github.io/claude-reads-hn
GitHub Actions cron is flaky. The CF Worker in infra/cf-worker/ triggers workflows reliably:
cd infra/cf-worker
npm install
wrangler secret put GITHUB_TOKEN # PAT with actions:write
wrangler deployCrons: 20:00, 01:00, 06:00, 11:00 UTC (same as GitHub Actions schedule)
- wake-up-claude - The OG quota poker, simple cron ping
- claude-quota-scheduler - The enterprise version with orchestration
All opinions in the digests are generated by an AI and do not represent
the views of anyone with actual judgment or legal liability.
If you're offended by a take, please remember:
1. It's an AI
2. It was specifically prompted to be spicy
3. Touch grass (both you and the AI)
No VCs were harmed in the making of this repository.
Some egos may have been bruised. That's a feature, not a bug.
powered by claude-code-action, poor life choices, and cron