octolens feeds list shows yours, and the
Feeds reference covers creating one.
1
Connect Slack (once per workspace)
Slack is interactive, admin-gated OAuth, so it lives in the browser — the
CLI does the hand-off and waits:The authorize URL is always printed before the command blocks, so on a
headless box you can open it
anywhere; the wait is bounded and an expiry
fails loudly rather than hanging. Already connected? It returns
immediately. Check any time with:Skip this step entirely for email or webhook destinations.
2
Find the channel id
Slack destinations take channel ids, not names — resolve them first:
octolens slack channelsFlagsWhen Slack is not connected this exits
2 (SLACK_NOT_CONNECTED)
pointing at octolens slack connect — rather than answering an empty
list — so a script piping the first id into the next step fails at the
real cause.3
Create the delivery rule
On a terminal with flags omitted, Cadence is
octolens notifications create runs a
short wizard: name, destination (with a live Slack channel picker), feed,
cadence. Headless runs spell everything out with flags:--frequency hourly|hourlyAtTopOfHour|daily|weekly (default
daily), with --time/--timezone for daily digests and
--day-of-week required for weekly ones. --delivery-mode picks one
digest per period (batch) or one message per mention (individual).
The schedule is deep-validated up front — a malformed --time, an
unknown timezone or a weekly rule with no day exits 2 naming the flag,
instead of persisting a schedule that never delivers.Two failures worth knowing by name: a feed that already has a
notification exits 2 (ITEM_EXISTS, naming the conflicting
notification id so you can update or remove it), and an unknown feed
exits 4 (FEED_NOT_FOUND).octolens notifications createFlags4
Prove it delivers
notifications test performs a real delivery of the latest
matching mention to every destination and reports the per-destination
outcome. Scheduled deliveries are untouched.On success the per-destination report is on stdout; on a failure the
whole report moves into the error document on stderr (same fields, plus
error), so you never lose the detail of which destination refused —
read results[] from stdout on exit 0 and from stderr otherwise.octolens notifications testArgumentsWhat Slack messages contain
Every card has the same structure; only the body text differs by source.- Long-form sources (LinkedIn, news, web pages, newsletters, podcast and YouTube descriptions, DEV and Medium articles) always show one sentence (at most about 280 characters) around the first whole monitored keyword, plus the relevance explanation — never the full source text. Markdown formatting scraped with the page (tables, headings, lists, bold) is flattened to plain text.
- Every other source shows a post of up to about 280 characters in full, with the first whole monitored keyword in bold. A longer post becomes a bounded excerpt of about that length centered on that keyword, plus the relevance explanation.
Webhooks
A webhook destination POSTs matching mentions to a public http(s) endpoint — the escape hatch into everything Slack and email are not:WEBHOOK_URL_INVALID (exit 2), and the same screen runs
again at every delivery.
Living with it
-
Patch, don’t re-create.
notifications updatechanges only what you pass — inside the destination you name, omitted fields are preserved, so fixing a webhook URL keeps its cadence: -
Pause and resume with
--disable/--enable; delete withoctolens notifications rm 7— like every deletion, headless runs require--yesor nothing is deleted. -
Email destinations need no setup at all:
--email a@acme.com,b@acme.com(the recipient list travels as one comma-separated value).
--destinations-json escape hatch
and the update-preservation rules are on the
Notifications reference.