From distillery
Generate an ambient intelligence digest from recent feed activity with source suggestions
npx claudepluginhub norrietaylor/distillery --plugin distilleryThis skill is limited to using the following tools:
<!-- Trigger phrases: radar, /radar, what's new, show my digest, ambient digest, what have I missed, feed digest -->
Curates Chinese digest of top-scoring (>7/10) RSS articles on AI agents, frontier commentary, interviews, and essays from fixed feeds; defaults to latest week or specific day.
Fetches unseen RSS feed items from Readwise Reader, filters for unopened, picks top 5 based on persona or quality, and renders markdown overview table. Useful for quick personalized feed catch-ups.
Generates daily or weekly digests of activity from connected sources (chat, email, docs, tasks, CRM), highlighting action items, decisions, mentions, and project updates.
Share bugs, ideas, or general feedback.
Radar surfaces recent feed entries, synthesizes them into a grouped digest, and suggests new sources to watch.
/radar)/radar --suggest)See CONVENTIONS.md — skip if already confirmed this conversation.
| Flag | Description |
|---|---|
--days N | Look back N days for recent feed entries (overrides feeds.digest.window_days, default 7) |
--limit N | Maximum number of feed entries to include (default: 20) |
--project <name> | Scope feed entries to a specific project |
--suggest | Include source suggestions at end of digest |
--store | Store digest as a knowledge entry (default: display-only) |
--include-evergreen | Include older / first-poll backfill items in the candidate set (default: excluded) |
The look-back window is bounded by metadata.published_at (the feed item's
publication timestamp), not created_at. Items with no published_at are
included unless they are flagged metadata.backfill = true (first-poll
backfill batches), in which case they are hidden by default. Pass
--include-evergreen to override and surface them.
Use tag-driven semantic search to surface the most relevant feed entries, not just the newest.
3a. Get interest profile from curated entries:
Build an interest profile that excludes feed-ingested content. Make separate distillery_list(group_by="tags", entry_type=<type>) calls for curated types: session, reference, bookmark, idea, note, and minutes. Merge the group counts across all responses, take the top 5 tags by combined count. Convert tag paths to natural language by taking the leaf segment and replacing hyphens with spaces (e.g., domain/authentication → query "authentication").
3b. Search by interests (primary path):
Compute published_after = (now - <days>).isoformat() where <days> is the
--days flag if provided, otherwise the configured feeds.digest.window_days
(default 7). For each of the top interest tags (up to 3 queries), call:
distillery_search(query="<interest>", entry_type="feed", limit=<ceil(limit/N)>, published_after=<iso>, include_evergreen=<bool>)
Where N is the number of queries. Pass include_evergreen=true only when the
user supplied --include-evergreen. If --project was specified, also pass
project=<name>.
Deduplicate results across queries by entry ID, keeping the highest similarity score.
Report: Retrieved <total> entries via interest-based search (<N> queries, window=<days>d).
3c. Fallback (if interest tags unavailable):
If none of the curated-type group_by="tags" calls return any tags, fall back to:
distillery_list(entry_type="feed", limit=<limit>, output_mode="summary", published_after=<iso>, include_evergreen=<bool>)
Report: Retrieved <total> entries via recent listing (fallback, window=<days>d).
If the curated-type group_by="tags" calls themselves error, treat that as an MCP error per the Rules section below — report and stop.
3d. Empty results:
If no feed entries are found by either path, display:
No feed entries found in the last <N> days.
Suggestions:
- Trigger feed polling via POST to /hooks/poll (or use /setup to configure scheduled polling)
- Add sources with /watch add <url>
- Check that feed sources are configured in distillery.yaml
Stop here if no entries exist.
You (the executing Claude instance) produce the synthesis — do not dump raw entries.
Grouping: Group entries by source tag if present (e.g., source/github, source/rss), or by topic otherwise.
Per group:
Cross-group summary: 2-3 sentences highlighting the most important signals across all sources.
When --suggest is specified, use the interest tags identified in Step 3a to suggest new sources. Based on the top interest topics, recommend 3–5 relevant RSS feeds or GitHub repos the user might want to add via /watch add <url>. Omit this section silently if Step 3a returned no tags or if --suggest was not specified.
If --store was specified, check for duplicate digests before storing.
Call distillery_find_similar(content="<digest summary>", dedup_action=True). Handle by action field:
"create": No similar entries. Proceed to Step 7.
"skip": Near-exact duplicate. Show similarity table and offer: (1) Store anyway, (2) Skip.
"merge": Very similar entry exists. Show similarity table and offer: (1) Store anyway, (2) Merge with existing, (3) Skip.
For merge: combine new digest with the most similar entry's content, call distillery_update with the entry ID and merged content, confirm and stop.
"link": Related but distinct. Show similarity table, note new entry will be linked. Ask to proceed or skip. If proceeding, include "related_entries": ["<id1>", ...] in metadata at Step 7.
Similar entries found:
| Entry ID | Similarity | Preview |
|----------|-----------|---------|
| <id> | <score%> | <content_preview> |
On skip in any case: "Skipped. No new entry was stored." and stop.
If --store was specified, store the digest. Determine author & project per CONVENTIONS.md.
Call distillery_store(content="<full digest markdown>", entry_type="digest", author="<author>", project="<project>", tags=["digest", "radar", "ambient"], metadata={"period_start": "<YYYY-MM-DD>", "period_end": "<YYYY-MM-DD>"}). Record the returned entry_id.
On MCP errors, see CONVENTIONS.md error handling — display and stop.
Display the digest. If --store was specified, append:
[digest] Stored: <entry_id>
Project: <project> | Author: <author>
Summary: <first 200 chars of digest>...
Tags: digest, radar, ambient
Omit the stored block if --store was not specified.
# Radar Digest — <YYYY-MM-DD>
<N> feed entries from the last <days> days.
---
## <Group Name>
<2-4 sentence summary>
- **<item title>** — <brief description> ([source](<url>))
---
## Overall Summary
<2-3 sentence cross-group synthesis>
---
## Suggested Sources
| # | URL | Type | Why |
|---|-----|------|-----|
| 1 | <url> | <type> | <rationale> |
To add a source: /watch add <url> [--type rss|github]
---
[digest] Stored: <entry_id>
Project: <project> | Author: <author>
Summary: <first 200 chars>...
Tags: digest, radar, ambient
feeds.digest.window_days (7 days); default limit is 20 — respect overridespublished_after (publication time), not date_from (ingest time) — older items polled today are not new intelligencemetadata.backfill = true) are excluded by default; surface them with --include-evergreen--store flagdigest, radar, ambient tags when storingentry_type="digest" for store callsperiod_start and period_end as ISO 8601 dates