/feed-brief
Runs the full feed-to-brief pipeline — fetches every configured source, scores and filters items by relevance, writes a human-voice brief per FEEDS.md, delivers it to the operator's configured channel, and archives it with rich frontmatter. Invoke with /hermitd-feed:feed-brief
Claude Code
$ npx -y skills add gtapps/hermitd --skill feed-brief --agent claude-code
Codex
$ npx skills add gtapps/hermitd --skill feed-brief -a codex -y
Cursor
$ npx skills add gtapps/hermitd --skill feed-brief -a cursor -y
Gemini CLI
$ npx skills add gtapps/hermitd --skill feed-brief -a gemini-cli -y
GitHub Copilot
$ npx skills add gtapps/hermitd --skill feed-brief -a github-copilot -y
OpenCode
$ npx skills add gtapps/hermitd --skill feed-brief -a opencode -y
Windsurf
$ npx skills add gtapps/hermitd --skill feed-brief -a windsurf -y
SKILL.md
feed-brief.SKILL.mdname: feed-brief
description: >-
Runs the full feed-to-brief pipeline — fetches every configured source, scores
and filters items by relevance, writes a human-voice brief per FEEDS.md, delivers
it to the operator's configured channel, and archives it with rich frontmatter.
Invoke with /hermitd-feed:feed-brief --morning|--evening|--slot <name> for
scheduled or on-demand briefs. Reads feed-sources.md, feed-categories.md, and FEEDS.md
from the project root.
Feed Brief
Run the full 7-phase brief pipeline for this project. Config lives at the project root (`feed-sources.md`, `feed-categories.md`, `FEEDS.md`); state and archive live under `.hermit/`.
Flags
- `--morning`: slot `morning`. Forward-looking. Emphasize what's new since yesterday evening, what's worth opening today, emerging patterns. Tone: calm, sharp, selective.
- `--evening`: slot `evening`. Backward-looking. Emphasize what changed during the day, what escalated or faded, what to carry into tomorrow. Tone: slightly more reflective.
- `--slot <name>`: custom slot label (e.g. `midday`). Use `<name>` verbatim wherever `<slot>` appears below. Orientation defaults to the morning (forward-looking) framing unless the operator's `FEEDS.md` says otherwise.
Resolve `<slot>` from the flag before starting. All filenames below use that resolved value.
Steps
1. Read `FEEDS.md` — brief philosophy, scoring rules, output format, and section guidance. 2. Read `feed-sources.md` — full source list with types and URLs. 3. Read `feed-categories.md` — operator's current focus areas and priority tiers (P1/P2). 4. Read `.hermit/config.json` — the `feed.enrichments.*` and `feed.reaction_feedback` gates consulted in Phases 3 and 5b. A gate runs only when its value is `true`; treat an absent key as disabled.
Phase 1 — Web/RSS sources
Before dispatch, run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/source-fetch-result.ts new-run "<absolute-output-path>"`. The path is the output-path contract's `<absolute-project-root>/tmp/feed-source-items-<slot>.json`. It deletes the previous output so a fetch that writes nothing surfaces as a missing file. Keep its printed `run_id` as the expected ID for this invocation; never infer it from an existing file or the agent's reply. If it prints `error`, follow the wholesale fetch-failure path below without dispatching.
Dispatch the `@hermitd-feed:source-fetcher` subagent (model: haiku) to fetch all `web` and `rss` sources from `feed-sources.md`. Pass the full source list (URLs + names), the resolved `<slot>`, the absolute project root and output path, and the generated `run_id` to copy exactly into the output JSON.
**Output-path contract:** the agent writes its extracted items to `tmp/feed-source-items-<slot>.json` in the project root (never `/tmp/`). Pass `<absolute-project-root>/tmp/feed-source-items-<slot>.json` to the agent so its inherited working directory cannot redirect the write. Items are nested under `sources[]`, each item: `{title, summary, url, published_at, source, section, author}`. No scoring — extraction only. After the agent returns, run:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/source-fetch-result.ts verify "<absolute-output-path>" "<expected-run-id>"Use the original expected ID, not an ID read from the output. It prints either `{"status":"rejected","reason":...}` or the accepted payload. Consume only that accepted JSON; do not re-read the raw file for candidate items. The verifier checks run identity and the envelope, not whether network fetches occurred.
**Reconcile against the file, not the reply** (mapping owned by `${CLAUDE_PLUGIN_ROOT}/docs/schema.md` §5). The agent's reply is a claim; only the verified file payload is eligible for reconciliation. This classifies `web`/`rss` sources only — `chrome`/`reddit`/`reddit-home`/`x` sources are absent from `sources[]` by design and are classified in Phase 2:
- Run ID generation fails, or verification prints `status: "rejected"` → every `web`/`rss` source in `feed-sources.md` goes to
`sources_skipped`. Continue to Phase 2 — do not re-dispatch the agent — and note the wholesale fetch failure in the brief's Source notes.
- A `web`/`rss` source with no entry in `sources[]` → `sources_skipped`, regardless of what the
reply claimed.
- Entry with `status: "failed"`, or any status other than `"ok"` → `sources_skipped`.
- Entry with `status: "ok"` and empty `items[]` → `sources_quiet`. An entry that did yield items
stays provisional: Phase 6 splits `sources_used` vs `sources_quiet` on what survived Phase 3 scoring, so a source whose items were all filtered out still lands in `sources_quiet`.
- Reply disagrees with the file → the file wins; note the discrepancy in the brief's Source notes.
Phase 2 — Chrome, reddit, and X sources
For each source whose type is `chrome`, `reddit`, `reddit-home`, or `x`:
- **`reddit`:** try `bun ${CLAUDE_PLUGIN_ROOT}/scripts/reddit-fetch.ts <subreddit> [limit]` FIRST.
- `posts` → map each post (`title, url, score, comments, permalink`) into the item format.
- `status: "unavailable"` or `error` → fall back to Chrome (below). If Chrome is unavailable, skip and mark the source in `sources_skipped`.
- **`chrome` / `reddit-home` / `x`:** these require a running Chrome. Check whether the Chrome MCP tools are
available (search `mcp__claude-in-chrome__` via ToolSearch). If Chrome is not available, SKIP the source gracefully and mark it in `sources_skipped` — Chrome availability is a deployment concern; do not attempt to launch a browser. If available, fetch per the operator's `FEEDS.md` Chrome guidance (process sequentially, extract the visible top items) into the item format.
Process Chrome-backed sources one at a time. Deduplicate against Phase 1 items.
Phase 2.5 — Collect fetch stats
Build a `fetch_log` array tracking per-source efficiency. Populate during Phases 1–2, finalize after Phase 3.
- **After Phase 1:** count items per source name → `items_yielded`. `tokens_
Read more
name: feed-brief description: >- Runs the full feed-to-brief pipeline — fetches every configured source, scores and filters items by relevance, writes a human-voice brief per FEEDS.md, delivers it to the operator's configured channel, and archives it with rich frontmatter. Invoke with /hermitd-feed:feed-brief --morning|--evening|--slot <name> for scheduled or on-demand briefs. Reads feed-sources.md, feed-categories.md, and FEEDS.md from the project root.
Feed Brief
Run the full 7-phase brief pipeline for this project. Config lives at the project root (`feed-sources.md`, `feed-categories.md`, `FEEDS.md`); state and archive live under `.hermit/`.
Flags
- `--morning`: slot `morning`. Forward-looking. Emphasize what's new since yesterday evening, what's worth opening today, emerging patterns. Tone: calm, sharp, selective.
- `--evening`: slot `evening`. Backward-looking. Emphasize what changed during the day, what escalated or faded, what to carry into tomorrow. Tone: slightly more reflective.
- `--slot <name>`: custom slot label (e.g. `midday`). Use `<name>` verbatim wherever `<slot>` appears below. Orientation defaults to the morning (forward-looking) framing unless the operator's `FEEDS.md` says otherwise.
Resolve `<slot>` from the flag before starting. All filenames below use that resolved value.
Steps
1. Read `FEEDS.md` — brief philosophy, scoring rules, output format, and section guidance. 2. Read `feed-sources.md` — full source list with types and URLs. 3. Read `feed-categories.md` — operator's current focus areas and priority tiers (P1/P2). 4. Read `.hermit/config.json` — the `feed.enrichments.*` and `feed.reaction_feedback` gates consulted in Phases 3 and 5b. A gate runs only when its value is `true`; treat an absent key as disabled.
Phase 1 — Web/RSS sources
Before dispatch, run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/source-fetch-result.ts new-run "<absolute-output-path>"`. The path is the output-path contract's `<absolute-project-root>/tmp/feed-source-items-<slot>.json`. It deletes the previous output so a fetch that writes nothing surfaces as a missing file. Keep its printed `run_id` as the expected ID for this invocation; never infer it from an existing file or the agent's reply. If it prints `error`, follow the wholesale fetch-failure path below without dispatching.
Dispatch the `@hermitd-feed:source-fetcher` subagent (model: haiku) to fetch all `web` and `rss` sources from `feed-sources.md`. Pass the full source list (URLs + names), the resolved `<slot>`, the absolute project root and output path, and the generated `run_id` to copy exactly into the output JSON.
**Output-path contract:** the agent writes its extracted items to `tmp/feed-source-items-<slot>.json` in the project root (never `/tmp/`). Pass `<absolute-project-root>/tmp/feed-source-items-<slot>.json` to the agent so its inherited working directory cannot redirect the write. Items are nested under `sources[]`, each item: `{title, summary, url, published_at, source, section, author}`. No scoring — extraction only. After the agent returns, run:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/source-fetch-result.ts verify "<absolute-output-path>" "<expected-run-id>"Use the original expected ID, not an ID read from the output. It prints either `{"status":"rejected","reason":...}` or the accepted payload. Consume only that accepted JSON; do not re-read the raw file for candidate items. The verifier checks run identity and the envelope, not whether network fetches occurred.
**Reconcile against the file, not the reply** (mapping owned by `${CLAUDE_PLUGIN_ROOT}/docs/schema.md` §5). The agent's reply is a claim; only the verified file payload is eligible for reconciliation. This classifies `web`/`rss` sources only — `chrome`/`reddit`/`reddit-home`/`x` sources are absent from `sources[]` by design and are classified in Phase 2:
- Run ID generation fails, or verification prints `status: "rejected"` → every `web`/`rss` source in `feed-sources.md` goes to
`sources_skipped`. Continue to Phase 2 — do not re-dispatch the agent — and note the wholesale fetch failure in the brief's Source notes.
- A `web`/`rss` source with no entry in `sources[]` → `sources_skipped`, regardless of what the
reply claimed.
- Entry with `status: "failed"`, or any status other than `"ok"` → `sources_skipped`.
- Entry with `status: "ok"` and empty `items[]` → `sources_quiet`. An entry that did yield items
stays provisional: Phase 6 splits `sources_used` vs `sources_quiet` on what survived Phase 3 scoring, so a source whose items were all filtered out still lands in `sources_quiet`.
- Reply disagrees with the file → the file wins; note the discrepancy in the brief's Source notes.
Phase 2 — Chrome, reddit, and X sources
For each source whose type is `chrome`, `reddit`, `reddit-home`, or `x`:
- **`reddit`:** try `bun ${CLAUDE_PLUGIN_ROOT}/scripts/reddit-fetch.ts <subreddit> [limit]` FIRST.
- `posts` → map each post (`title, url, score, comments, permalink`) into the item format.
- `status: "unavailable"` or `error` → fall back to Chrome (below). If Chrome is unavailable, skip and mark the source in `sources_skipped`.
- **`chrome` / `reddit-home` / `x`:** these require a running Chrome. Check whether the Chrome MCP tools are
available (search `mcp__claude-in-chrome__` via ToolSearch). If Chrome is not available, SKIP the source gracefully and mark it in `sources_skipped` — Chrome availability is a deployment concern; do not attempt to launch a browser. If available, fetch per the operator's `FEEDS.md` Chrome guidance (process sequentially, extract the visible top items) into the item format.
Process Chrome-backed sources one at a time. Deduplicate against Phase 1 items.
Phase 2.5 — Collect fetch stats
Build a `fetch_log` array tracking per-source efficiency. Populate during Phases 1–2, finalize after Phase 3.
- **After Phase 1:** count items per source name → `items_yielded`. `tokens_
Run an always-on Claude Code agent on your own machine, for you or your team. Start and orchestrate sessions from chat in any project it can reach. Take over the same session in the Claude app or the CLI.
Other skills on hermitd.
More skills from other plugins.
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…
Questions about feed-brief.
- Which coding agents can use feed-brief?
- feed-brief installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

