Daily Brief
User-configurable daily intelligence newsletter platform. Pick a niche, plug in real data sources, get an analyst-grade HTML brief — synthesized by Claude Opus, archived publicly, delivered to inbox (email wiring v2).
The product preserves the structural philosophy of Cowork's daily-ai-bulletin SKILL: 24h recency cutoff, multi-source triangulation, social signal layer, "skip if empty" sections, "Signals & Opportunities" synthesis, no fabrication.
Live
- Admin: https://holyai.me/daily-brief/
- Public archive per niche: https://holyai.me/daily-brief/n/<slug>
- Per-day brief: https://holyai.me/daily-brief/n/<slug>/<YYYY-MM-DD>
- Health: https://holyai.me/daily-brief/health
What it does
- You configure a "niche": a name, a free-form description (passed verbatim to the agent — this is your editorial direction), optional special instructions, recipient email, language, delivery cron, recency window.
- You attach sources: any combination of
rss,hackernews(Algolia API),brave(Brave Search query string),reddit(subreddit name),html(article-listing page),twitter(handle, scraped via Brave Search since the X API isn't free). - The cron fires daily at the per-niche schedule. Pipeline:
- - Fetch every active source, dedupe URLs, drop items older than the recency window
- - Pick top items by
signal_score, cap at 80 - - Single Opus call (
anthropic/claude-opus-4.5via OpenRouter) writes the HTML brief using the Cowork-style prompt - - Defensive parsing strips agent-proposed source additions into a separate review queue
- - Brief is saved (idempotent — running twice the same day is a no-op unless
force: true) - Browse archive publicly at
/daily-brief/n/<slug>/.
Hard rules (preserved across deploys)
- No mock data. Every item in a brief traces to a real fetched URL with a real
published_attimestamp. If a fetcher fails, the source is marked failed (auto-paused after 5 consecutive fails). No "seeded" items. - No auth. All UI and API routes are public.
- No fabrication. The agent must cite every claim; URLs that didn't appear in the items pool are tracked but not auto-stripped (analysts cite secondary sources too).
- Skip empty. No padding sections. A "quiet day" emits a single-line "the wires were quiet today" brief.
Source kinds
| kind | target format | API key needed |
|---|---|---|
| rss | full RSS/Atom URL | none |
| hackernews | front_page or a search query | none |
| brave | search query string | BRAVE_API_KEY |
| reddit | subreddit_name (or name:limit) | none |
| html | URL of an article-listing page | none |
| twitter | handle (without @) — scraped via Brave Search | BRAVE_API_KEY |
API
GET /daily-brief/api/niches
POST /daily-brief/api/niches
GET /daily-brief/api/niches/:id
PUT /daily-brief/api/niches/:id
DELETE /daily-brief/api/niches/:id
POST /daily-brief/api/niches/:id/run (force a run, returns the brief result)
GET /daily-brief/api/niches/:id/sources/kinds (list of supported source kinds)
POST /daily-brief/api/niches/:id/sources
DELETE /daily-brief/api/niches/:id/sources/:sid
POST /daily-brief/api/niches/:id/sources/:sid/unpause
POST /daily-brief/api/niches/:id/proposals/:pid/accept
POST /daily-brief/api/niches/:id/proposals/:pid/reject
GET /daily-brief/api/niches/:id/run-log
GET /daily-brief/api/briefs/:id
GET /daily-brief/api/briefs/:id/items
Stack
Node 22+, Express, better-sqlite3 (WAL), node-cron, helmet, compression. Synthesis via OpenRouter (anthropic/claude-opus-4.5).
Roadmap
- v1 (shipped): web UI + archive + cron + synthesis
- v2: email delivery (Gmail OAuth via gog-gmail MCP locally; SMTP via nodemailer in production)
- v3: subscriber self-management (magic-link), per-section depth knobs, public RSS feed