Skip to main content

Blogwatcher

Monitor blogs and RSS/Atom feeds via blogwatcher-cli tool.

Skill metadata

SourceOptional — install with hermes skills install official/research/blogwatcher
Pathoptional-skills/research/blogwatcher
Version2.0.0
AuthorJulienTant (fork of Hyaxia/blogwatcher)
LicenseMIT
Platformslinux, macos, windows
TagsRSS, Blogs, Feed-Reader, Monitoring

Reference: full SKILL.md

info

The following is the complete skill definition that Hermes loads when this skill is triggered. This is what the agent sees as instructions when the skill is active.

Blogwatcher

Track blog and RSS/Atom feed updates with the blogwatcher-cli tool. Supports automatic feed discovery, HTML scraping fallback, OPML import, and read/unread article management.

Working with Hermes tools (read this first)

blogwatcher-cli is the feed database; Hermes tools do the automation around it:

  • Recurring watch — use the cronjob tool's monitor field, not a bare schedule. monitor runs a script each tick and only wakes the agent when output changes: set it to a script that runs blogwatcher-cli scan >/dev/null 2>&1 && blogwatcher-cli articles (deterministic output; new articles = changed output = agent wakes with the diff injected). Unchanged ticks cost zero LLM calls. Set deliver to route digests to a chat/channel; add continuity: true so consecutive digests can dedupe.
  • Reading an article the user asks about: web_extract([url]) on the article URL from blogwatcher-cli articles — do not re-scrape by hand.
  • One-off "watch this page for changes" without feed semantics: skip this skill; the cronjob tool's monitor field accepts an http(s) URL directly.
  • Company/competitor tracking with analysis and citations: prefer the competitor-news-monitor skill; blogwatcher is the lighter raw-feed layer it can sit on.

Installation

Pick one method:

  • Go: go install github.com/JulienTant/blogwatcher-cli/cmd/blogwatcher-cli@latest
  • Docker: docker run --rm -v blogwatcher-cli:/data ghcr.io/julientant/blogwatcher-cli
  • Binary (Linux amd64): curl -sL https://github.com/JulienTant/blogwatcher-cli/releases/latest/download/blogwatcher-cli_linux_amd64.tar.gz | tar xz -C /usr/local/bin blogwatcher-cli
  • Binary (Linux arm64): curl -sL https://github.com/JulienTant/blogwatcher-cli/releases/latest/download/blogwatcher-cli_linux_arm64.tar.gz | tar xz -C /usr/local/bin blogwatcher-cli
  • Binary (macOS Apple Silicon): curl -sL https://github.com/JulienTant/blogwatcher-cli/releases/latest/download/blogwatcher-cli_darwin_arm64.tar.gz | tar xz -C /usr/local/bin blogwatcher-cli
  • Binary (macOS Intel): curl -sL https://github.com/JulienTant/blogwatcher-cli/releases/latest/download/blogwatcher-cli_darwin_amd64.tar.gz | tar xz -C /usr/local/bin blogwatcher-cli

All releases: https://github.com/JulienTant/blogwatcher-cli/releases

Docker with persistent storage

By default the database lives at ~/.blogwatcher-cli/blogwatcher-cli.db. In Docker this is lost on container restart. Use BLOGWATCHER_DB or a volume mount to persist it:

# Named volume (simplest)
docker run --rm -v blogwatcher-cli:/data -e BLOGWATCHER_DB=/data/blogwatcher-cli.db ghcr.io/julientant/blogwatcher-cli scan

# Host bind mount
docker run --rm -v /path/on/host:/data -e BLOGWATCHER_DB=/data/blogwatcher-cli.db ghcr.io/julientant/blogwatcher-cli scan

Migrating from the original blogwatcher

If upgrading from Hyaxia/blogwatcher, move your database:

mv ~/.blogwatcher/blogwatcher.db ~/.blogwatcher-cli/blogwatcher-cli.db

The binary name changed from blogwatcher to blogwatcher-cli.

Common Commands

Managing blogs

  • Add a blog: blogwatcher-cli add "My Blog" https://example.com
  • Add with explicit feed: blogwatcher-cli add "My Blog" https://example.com --feed-url https://example.com/feed.xml
  • Add with HTML scraping: blogwatcher-cli add "My Blog" https://example.com --scrape-selector "article h2 a"
  • List tracked blogs: blogwatcher-cli blogs
  • Remove a blog: blogwatcher-cli remove "My Blog" --yes
  • Import from OPML: blogwatcher-cli import subscriptions.opml

Scanning and reading

  • Scan all blogs: blogwatcher-cli scan
  • Scan one blog: blogwatcher-cli scan "My Blog"
  • List unread articles: blogwatcher-cli articles
  • List all articles: blogwatcher-cli articles --all
  • Filter by blog: blogwatcher-cli articles --blog "My Blog"
  • Filter by category: blogwatcher-cli articles --category "Engineering"
  • Mark article read: blogwatcher-cli read 1
  • Mark article unread: blogwatcher-cli unread 1
  • Mark all read: blogwatcher-cli read-all
  • Mark all read for a blog: blogwatcher-cli read-all --blog "My Blog" --yes

Environment Variables

All flags can be set via environment variables with the BLOGWATCHER_ prefix:

VariableDescription
BLOGWATCHER_DBPath to SQLite database file
BLOGWATCHER_WORKERSNumber of concurrent scan workers (default: 8)
BLOGWATCHER_SILENTOnly output "scan done" when scanning
BLOGWATCHER_YESSkip confirmation prompts
BLOGWATCHER_CATEGORYDefault filter for articles by category

Example Output

$ blogwatcher-cli blogs
Tracked blogs (1):

xkcd
URL: https://xkcd.com
Feed: https://xkcd.com/atom.xml
Last scanned: 2026-04-03 10:30
$ blogwatcher-cli scan
Scanning 1 blog(s)...

xkcd
Source: RSS | Found: 4 | New: 4

Found 4 new article(s) total!
$ blogwatcher-cli articles
Unread articles (2):

[1] [new] Barrel - Part 13
Blog: xkcd
URL: https://xkcd.com/3095/
Published: 2026-04-02
Categories: Comics, Science

[2] [new] Volcano Fact
Blog: xkcd
URL: https://xkcd.com/3094/
Published: 2026-04-01
Categories: Comics

Notes

  • Auto-discovers RSS/Atom feeds from blog homepages when no --feed-url is provided.
  • Falls back to HTML scraping if RSS fails and --scrape-selector is configured.
  • Categories from RSS/Atom feeds are stored and can be used to filter articles.
  • Import blogs in bulk from OPML files exported by Feedly, Inoreader, NewsBlur, etc.
  • Database stored at ~/.blogwatcher-cli/blogwatcher-cli.db by default (override with --db or BLOGWATCHER_DB).
  • Use blogwatcher-cli <command> --help to discover all flags and options.