Add a watch command (--interval, --once, --no-enrich): a long-lived daemon that re-ingests every enabled source on a ticker and, when a webhook is configured, POSTs genuinely new high-signal stories to it (Slack, Discord, or any JSON endpoint via a text/content/items payload). internal/watch is a pure, stdlib-only scheduler: the pipeline is injected as a Cycle closure, so the daemon is fully unit-testable with a fake ticker and notifier. Graceful shutdown on SIGINT/SIGTERM returns cleanly; a cycle error is logged and the loop continues (fail-soft). Notify uses a dedicated fetch-time watermark (store.NewlyFetchedClusters) so a freshly ingested but older-dated advisory is surfaced, which a publish-time filter would drop. Notable stories are capped by watch.notify_max_items and filtered by score threshold or KEV status. Extract the shared ingest and cluster sequence (pipeline.go) so scrape and watch cannot drift, and route scrape and enrich through cmd.Context() so they honor SIGTERM too. |
||
|---|---|---|
| .. | ||
| cmd/nadezhda | ||
| internal | ||
| testdata | ||
| .gitignore | ||
| README.md | ||
| go.mod | ||
| go.sum | ||
| justfile | ||
README.md
Nadezhda
A concurrent security-news and CVE aggregation engine, written in Go.
Nadezhda ingests cybersecurity news from reliable RSS feeds, enriches every referenced CVE with authoritative exploit intelligence (NVD, CISA KEV, FIRST EPSS), clusters the same story across outlets, ranks items by real-world significance, and surfaces content angles. It ships as a single static binary with a local SQLite store, a colorful terminal UI, and Markdown/JSON export.
Status
Early development. The scaffold is in place: configuration, source registry, SQLite store with forward-only migrations, and the command skeleton.
nadezhda version # print version
nadezhda sources # list configured feeds and persist them to the store
Ingestion, CVE enrichment, ranking, the TUI, and the AI ideation layer land in subsequent milestones.
Build
just build # -> ./nadezhda
just test
Requires Go 1.25+.
Full documentation lands in learn/ as the project matures.