Monitor blogs and RSS/Atom feeds for updates using the blogwatcher-cli tool. Add blogs, scan for new articles, track read status, and filter by category.
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.
Pick one method:
go install github.com/JulienTant/blogwatcher-cli/cmd/blogwatcher-cli@latestdocker run --rm -v blogwatcher-cli:/data ghcr.io/julientant/blogwatcher-clicurl -sL https://github.com/JulienTant/blogwatcher-cli/releases/latest/download/blogwatcher-cli_linux_amd64.tar.gz | tar xz -C /usr/local/bin blogwatcher-clicurl -sL https://github.com/JulienTant/blogwatcher-cli/releases/latest/download/blogwatcher-cli_linux_arm64.tar.gz | tar xz -C /usr/local/bin blogwatcher-clicurl -sL https://github.com/JulienTant/blogwatcher-cli/releases/latest/download/blogwatcher-cli_darwin_arm64.tar.gz | tar xz -C /usr/local/bin blogwatcher-clicurl -sL https://github.com/JulienTant/blogwatcher-cli/releases/latest/download/blogwatcher-cli_darwin_amd64.tar.gz | tar xz -C /usr/local/bin blogwatcher-cliAll releases: https://github.com/JulienTant/blogwatcher-cli/releases
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
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.
blogwatcher-cli add "My Blog" https://example.comblogwatcher-cli add "My Blog" https://example.com --feed-url https://example.com/feed.xmlblogwatcher-cli add "My Blog" https://example.com --scrape-selector "article h2 a"blogwatcher-cli blogsblogwatcher-cli remove "My Blog" --yesblogwatcher-cli import subscriptions.opmlblogwatcher-cli scanblogwatcher-cli scan "My Blog"blogwatcher-cli articlesblogwatcher-cli articles --allblogwatcher-cli articles --blog "My Blog"blogwatcher-cli articles --category "Engineering"blogwatcher-cli read 1blogwatcher-cli unread 1blogwatcher-cli read-allblogwatcher-cli read-all --blog "My Blog" --yesAll flags can be set via environment variables with the BLOGWATCHER_ prefix:
| Variable | Description |
|---|---|
BLOGWATCHER_DB | Path to SQLite database file |
BLOGWATCHER_WORKERS | Number of concurrent scan workers (default: 8) |
BLOGWATCHER_SILENT | Only output "scan done" when scanning |
BLOGWATCHER_YES | Skip confirmation prompts |
BLOGWATCHER_CATEGORY | Default filter for articles by category |
$ 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
--feed-url is provided.--scrape-selector is configured.~/.blogwatcher-cli/blogwatcher-cli.db by default (override with --db or BLOGWATCHER_DB).blogwatcher-cli <command> --help to discover all flags and options.