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 documentationblogwatcher-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 toBLOGWATCHER_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-urlis not provided. - HTML scraping fallback only works if
--scrape-selectoris 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_DBenv var. - Binary name changed from
blogwatchertoblogwatcher-cliwhen 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-selectoris 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
--yesflag will prompt for confirmation; if not provided, command may hang.