BundledResearchVersion 2.0.0

Track Blog and RSS Updates with Blogwatcher-cli in Hermes Agent

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

Written by Neura Market from the official Hermes Agent documentation for Blogwatcher. Commands, paths, and version numbers are reproduced from the source unchanged.

Read the official documentation

blogwatcher-cli Reference

Overview

blogwatcher-cli is a command-line tool that tracks updates from blogs and RSS/Atom feeds. It provides automatic feed discovery, HTML scraping fallback, OPML import, and read/unread article management. The tool is designed for users who want a lightweight, non-GUI feed aggregator that can scan feeds concurrently with a configurable worker count.

Installation

Choose one of the following methods:

  • Go install: Run go install github.com/JulienTant/blogwatcher-cli/cmd/blogwatcher-cli@latest.
  • Docker: Run docker run --rm -v blogwatcher-cli:/data ghcr.io/julientant/blogwatcher-cli.
  • Linux amd64 binary: Run 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.
  • Linux arm64 binary: Run 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.
  • macOS Apple Silicon binary: Run 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.
  • macOS Intel binary: Run 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 are available at https://github.com/JulienTant/blogwatcher-cli/releases.

Prerequisites

  • Go installed (for Go install method) or Docker installed (for Docker method) or curl and tar (for binary method).
  • Network access to blog URLs and GitHub releases.
  • Write permission to /usr/local/bin (for binary install) or appropriate directory.
  • For Docker: ability to run Docker commands and create volumes/bind mounts.
  • For migration: original blogwatcher database at ~/.blogwatcher/blogwatcher.db.

Docker with Persistent Storage

The default database location is ~/.blogwatcher-cli/blogwatcher-cli.db. In Docker, the database is lost on container restart unless persisted. To persist, use a named volume or host bind mount and set the BLOGWATCHER_DB environment variable.

# 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 Original blogwatcher

If upgrading from Hyaxia/blogwatcher, move the old database. Note that the binary name changed from blogwatcher to blogwatcher-cli.

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

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

Listing Tracked Blogs

$ blogwatcher-cli blogs
Tracked blogs (1):

  xkcd
    URL: https://xkcd.com
    Feed: https://xkcd.com/atom.xml
    Last scanned: 2026-04-03 10:30

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 by ID: blogwatcher-cli read 1
  • Mark article unread by ID: 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

Scanning All Blogs

$ blogwatcher-cli scan
Scanning 1 blog(s)...

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

Found 4 new article(s) total!

Listing Unread Articles

$ 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

Configuration

All flags can be set via environment variables with the BLOGWATCHER_ prefix. The following environment variables are available:

  • BLOGWATCHER_DB: Path to SQLite database file. Default: ~/.blogwatcher-cli/blogwatcher-cli.db.
  • BLOGWATCHER_WORKERS: Number of concurrent scan workers. Default: 8.
  • BLOGWATCHER_SILENT: Only output "scan done" when scanning.
  • BLOGWATCHER_YES: Skip confirmation prompts globally.
  • BLOGWATCHER_CATEGORY: Default filter for articles by category.

Command-Line Flags

  • --feed-url: Explicit feed URL when adding a blog.
  • --scrape-selector: CSS selector for HTML scraping fallback when adding a blog.
  • --all: Show all articles (not just unread) when listing.
  • --blog: Filter articles or read-all by blog name.
  • --category: Filter articles by category.
  • --yes: Skip confirmation prompts for remove or read-all.
  • --db: Override database path (alternative to BLOGWATCHER_DB).

Use blogwatcher-cli --help to discover all flags and options.

Constraints and Caveats

  • Auto-discovers RSS/Atom feeds from blog homepages only when --feed-url is not provided.
  • HTML scraping fallback only works if --scrape-selector is configured and RSS fails.
  • Categories are only stored if present in the RSS/Atom feed.
  • OPML import supports files exported from Feedly, Inoreader, NewsBlur, etc.
  • Default database location is ~/.blogwatcher-cli/blogwatcher-cli.db.
  • In Docker, database is lost on container restart unless persisted via volume mount and BLOGWATCHER_DB env var.
  • Binary name changed from blogwatcher to blogwatcher-cli when migrating from original.

Failure Modes

  • Docker container restarts cause database loss if not persisted.
  • RSS/Atom feed discovery may fail if homepage does not link to feed; use --feed-url.
  • HTML scraping may fail if --scrape-selector is not configured or selector is invalid.
  • OPML import may fail if file is malformed or from unsupported source.
  • Scan may fail if blog URL is unreachable or feed is invalid.
  • Removing a blog without --yes flag will prompt for confirmation; if not provided, command may hang.

More Research skills