Herald is a local-first Claude Code plugin that provides news intelligence for AI agents: it collects articles from RSS feeds and Hacker News, deduplicates by URL, clusters related articles into stories via title similarity, scores them by source weight and recency, and generates a ranked Markdown brief — entirely on-device, no API keys required.
- Bootstrap configuration, scheduler installation, and first fetch via
/news-init [topic] - Add individual RSS/Atom feed URLs or curated topic packs via
/news-add - List configured sources with tier weight and last-fetch status, or remove a source via
/news-sources [remove <name>] - Read today's ranked digest (on-demand fetch if not yet available) via
/news-digest - Trigger immediate fetch-and-analyze cycle outside normal schedule via
/news-run - Show article/story counts and last pipeline run time via
/news-status - Uninstall the scheduler while preserving config and historical data via
/news-stop - Automatic session-start reminder via
SessionStarthook when a fresh digest is available - Auto-activating
news-digestskill that reads the digest inline when conversation contains trigger phrases - 4-stage local pipeline: Collect (RSS + HN Algolia + optional Tavily) → Ingest (URL canonicalization + dedup) → Cluster (SequenceMatcher title similarity) → Project (scored Markdown brief)
- SQLite + FTS5 storage backend with WAL mode; no external database required
- URL deduplication via canonicalization in Ingest stage + title similarity clustering (SequenceMatcher, default threshold 0.65, configurable)
- Curated built-in topic packs:
ai-engineering,rust,devops,golang,typescript,security,python,data - Two-layer config overlay: immutable preset (bundled YAML) + user override (
~/.herald/config.yaml)
- Cross-platform scheduler: launchd (macOS), systemd user timer (Linux), cron fallback
- Optional Tavily web-search adapter for supplemental results (requires
TAVILY_API_KEY)
- Real-time or sub-hourly news alerting — the pipeline is batch-based (daily by default); not designed for real-time push
- Scheduler setup on systems without write access to
~/Library/LaunchAgents(macOS) or~/.config/systemd/user/(Linux) is not supported - Title-similarity deduplication for very short titles (under 5 words) is explicitly out of scope for reliable dedup
- Test suite passes under pytest with
pythonpath = ["src"]andtestpaths = ["tests"] - v2 database module creates all required tables (sources, articles, stories, story_articles, mentions, pipeline_runs) plus FTS5 virtual tables
- Database has foreign keys enabled and runs in WAL journal mode
- Plugin installs successfully via
claude plugin install herald@emporium /news-digest --demoreturns a formatted digest (documented acceptance check in FAQ)- Scheduler is installed and fires at 07:00 daily (or configured interval);
launchctl list | grep heraldconfirms loading on macOS - Brief output is stored as
~/.herald/briefs/{run_id}.mdwith YAML frontmatter
- AI-Assisted Developer: A software engineer using Claude Code daily who wants a curated news brief injected into their session without leaving the terminal. Primary consumer of
/news-digestand the auto-activating skill. - Plugin Installer / First-Time User: Someone running
/news-initto bootstrap Herald for the first time, selecting a topic preset and verifying the scheduler is active. Relies on FAQ and troubleshooting docs. - Power User / Feed Curator: A user who actively manages sources with
/news-add,/news-sources, and customconfig.yamloverrides — adjusting tier weights, topic keywords, and clustering thresholds. - CI / Scheduled System: The launchd/systemd/cron scheduler that invokes
run.shdaily. Automated, non-interactive. Reads no output; relies on lockfile discipline and log rotation.