← back to gallery

Daily Brief

Synthesis-first newsletters — pick a niche, get an analyst-grade brief every morning

ainewsletteragentsrssresearchanalyst
Open product ↗

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

What it does

  1. 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.
  2. 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).
  3. The cron fires daily at the per-niche schedule. Pipeline:
  4. - Fetch every active source, dedupe URLs, drop items older than the recency window
  5. - Pick top items by signal_score, cap at 80
  6. - Single Opus call (anthropic/claude-opus-4.5 via OpenRouter) writes the HTML brief using the Cowork-style prompt
  7. - Defensive parsing strips agent-proposed source additions into a separate review queue
  8. - Brief is saved (idempotent — running twice the same day is a no-op unless force: true)
  9. Browse archive publicly at /daily-brief/n/<slug>/.

Hard rules (preserved across deploys)

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