Fork of Hyaxia/blogwatcher.
A Go CLI tool to track blog articles, detect new posts, and manage read/unread status. Supports both RSS/Atom feeds and HTML scraping as fallback.
# Install via go
go install github.com/JulienTant/blogwatcher-cli/cmd/blogwatcher-cli@latest
# Or build locally
go build ./cmd/blogwatcher-cli
# Or run via Docker
docker run --rm -v blogwatcher-cli:/data ghcr.io/julientant/blogwatcher-cli
Pre-built binaries for Linux, macOS, and Windows are available on the GitHub Releases page.
# Add a blog (auto-discovers RSS feed)
blogwatcher-cli add "My Favorite Blog" https://example.com/blog
# Add with explicit feed URL
blogwatcher-cli add "Tech Blog" https://techblog.com --feed-url https://techblog.com/rss.xml
# Add with HTML scraping selector (for blogs without feeds)
blogwatcher-cli add "No-RSS Blog" https://norss.com --scrape-selector "article h2 a"
# List all tracked blogs
blogwatcher-cli blogs
# Remove a blog (and all its articles)
blogwatcher-cli remove "My Favorite Blog"
# Remove without confirmation
blogwatcher-cli remove "My Favorite Blog" -y
# Scan all blogs for new articles
blogwatcher-cli scan
# Scan a specific blog
blogwatcher-cli scan "Tech Blog"
# List unread articles
blogwatcher-cli articles
# List all articles (including read)
blogwatcher-cli articles --all
# List articles from a specific blog
blogwatcher-cli articles --blog "Tech Blog"
# Filter articles by publication date
blogwatcher-cli articles --since 2024-01-01 # Articles on or after Jan 1, 2024 (inclusive)
blogwatcher-cli articles --before 2024-01-15 # Articles before Jan 15, 2024 (exclusive)
blogwatcher-cli articles --since 2024-01-01 --before 2024-01-15 # Articles from Jan 1 up to but not including Jan 15
Date filters use the published_date of articles and require the format YYYY-MM-DD. Articles without a publication date are excluded when date filters are applied.
# Mark an article as read (use article ID from articles list)
blogwatcher-cli read 42
# Mark an article as unread
blogwatcher-cli unread 42
# Mark all unread articles as read
blogwatcher-cli read-all
# Mark all unread articles as read for a blog (skip prompt)
blogwatcher-cli read-all --blog "Tech Blog" --yes
scrape_selector is configured, it falls back to HTML scrapingblogwatcher-cli searches for feeds in two ways:
<link rel="alternate"> tags with RSS/Atom types/feed, /rss, /feed.xml, /atom.xml, etc.When RSS isn't available, provide a CSS selector that matches article links:
# Example selectors
--scrape-selector "article h2 a" # Links inside article h2 tags
--scrape-selector ".post-title a" # Links with post-title class
--scrape-selector "#blog-posts a" # Links inside blog-posts ID
blogwatcher-cli stores data in SQLite at ~/.blogwatcher-cli/blogwatcher-cli.db.
If upgrading from the original Hyaxia/blogwatcher, migrate your existing database:
mv ~/.blogwatcher/blogwatcher.db ~/.blogwatcher-cli/blogwatcher-cli.db
Tables:
mise install
# Run all tests
gotestsum -- ./...
# Run e2e tests only
gotestsum -- ./e2e/ -count=1
# Update e2e expected output after intentional changes
UPDATE_EXPECTED=1 go test ./e2e/ -run TestE2E/flags
Push a tag to trigger a release (binaries + Docker images to GHCR):
git tag vX.Y.Z
git push origin vX.Y.Z
MIT
Go
99.0%
Dockerfile
1.0%
Fork of Hyaxia/blogwatcher.
A Go CLI tool to track blog articles, detect new posts, and manage read/unread status. Supports both RSS/Atom feeds and HTML scraping as fallback.
# Install via go
go install github.com/JulienTant/blogwatcher-cli/cmd/blogwatcher-cli@latest
# Or build locally
go build ./cmd/blogwatcher-cli
# Or run via Docker
docker run --rm -v blogwatcher-cli:/data ghcr.io/julientant/blogwatcher-cli
Pre-built binaries for Linux, macOS, and Windows are available on the GitHub Releases page.
# Add a blog (auto-discovers RSS feed)
blogwatcher-cli add "My Favorite Blog" https://example.com/blog
# Add with explicit feed URL
blogwatcher-cli add "Tech Blog" https://techblog.com --feed-url https://techblog.com/rss.xml
# Add with HTML scraping selector (for blogs without feeds)
blogwatcher-cli add "No-RSS Blog" https://norss.com --scrape-selector "article h2 a"
# List all tracked blogs
blogwatcher-cli blogs
# Remove a blog (and all its articles)
blogwatcher-cli remove "My Favorite Blog"
# Remove without confirmation
blogwatcher-cli remove "My Favorite Blog" -y
# Scan all blogs for new articles
blogwatcher-cli scan
# Scan a specific blog
blogwatcher-cli scan "Tech Blog"
# List unread articles
blogwatcher-cli articles
# List all articles (including read)
blogwatcher-cli articles --all
# List articles from a specific blog
blogwatcher-cli articles --blog "Tech Blog"
# Filter articles by publication date
blogwatcher-cli articles --since 2024-01-01 # Articles on or after Jan 1, 2024 (inclusive)
blogwatcher-cli articles --before 2024-01-15 # Articles before Jan 15, 2024 (exclusive)
blogwatcher-cli articles --since 2024-01-01 --before 2024-01-15 # Articles from Jan 1 up to but not including Jan 15
Date filters use the published_date of articles and require the format YYYY-MM-DD. Articles without a publication date are excluded when date filters are applied.
# Mark an article as read (use article ID from articles list)
blogwatcher-cli read 42
# Mark an article as unread
blogwatcher-cli unread 42
# Mark all unread articles as read
blogwatcher-cli read-all
# Mark all unread articles as read for a blog (skip prompt)
blogwatcher-cli read-all --blog "Tech Blog" --yes
scrape_selector is configured, it falls back to HTML scrapingblogwatcher-cli searches for feeds in two ways:
<link rel="alternate"> tags with RSS/Atom types/feed, /rss, /feed.xml, /atom.xml, etc.When RSS isn't available, provide a CSS selector that matches article links:
# Example selectors
--scrape-selector "article h2 a" # Links inside article h2 tags
--scrape-selector ".post-title a" # Links with post-title class
--scrape-selector "#blog-posts a" # Links inside blog-posts ID
blogwatcher-cli stores data in SQLite at ~/.blogwatcher-cli/blogwatcher-cli.db.
If upgrading from the original Hyaxia/blogwatcher, migrate your existing database:
mv ~/.blogwatcher/blogwatcher.db ~/.blogwatcher-cli/blogwatcher-cli.db
Tables:
mise install
# Run all tests
gotestsum -- ./...
# Run e2e tests only
gotestsum -- ./e2e/ -count=1
# Update e2e expected output after intentional changes
UPDATE_EXPECTED=1 go test ./e2e/ -run TestE2E/flags
Push a tag to trigger a release (binaries + Docker images to GHCR):
git tag vX.Y.Z
git push origin vX.Y.Z
MIT
Go
99.0%
Dockerfile
1.0%