rss2go is a lightweight, modern RSS feed aggregator and notifier. It periodically scrapes RSS/Atom feeds and emails new items to subscribed addresses.
- Modular Architecture: Decoupled crawler, mailer, and feed watcher pools.
- Pure Go Persistence: Uses SQLite (
modernc.org/sqlite) for storage—no CGO required. - Dynamic Sync: Automatically detects added or removed feeds without restarting the daemon.
- Structured Logging: Powered by Go's
log/slog. - Robust Configuration: Load settings from YAML, JSON, TOML, or Environment Variables via
spf13/viper. - Observability: Prometheus-style
/metricsendpoint. - Graceful Shutdown: Context-aware design ensures all workers finish clean on SIGINT/SIGTERM.
Ensure you have Go 1.24+ installed.
git clone https://github.com/hobeone/rss2go.git
cd rss2go
go build -o rss2go ./cmd/rss2gorss2go looks for a configuration file named rss2go.yaml in the current directory by default. You can override this with the --config flag.
# Database location
db_path: "rss2go.db"
# Log level: debug, info, warn, error
log_level: "info"
# Polling settings
poll_interval: "1h"
poll_jitter: "5m"
# Crawler settings
crawler_pool_size: 5
crawler_timeout: "30s"
# Mailer settings (SMTP)
smtp_server: "smtp.gmail.com"
smtp_port: 587
smtp_user: "your-email@gmail.com"
smtp_pass: "your-app-password"
smtp_sender: "rss2go@example.com"
# Mailer settings (Alternative: Local Sendmail)
# sendmail: "/usr/sbin/sendmail"
# Metrics server
metrics_addr: ":8080"rss2go uses a hierarchical command structure.
./rss2go daemon# Add a feed
./rss2go feed add "https://go.dev/blog/feed.atom" "Go Blog"
# List feeds (find IDs)
./rss2go feed list
# Delete a feed
./rss2go feed del 1 # or URL: ./rss2go feed del https://...
# Catch up unread items without mailing
./rss2go feed catchup 1# Add a user
./rss2go user add "subscriber@example.com"
# Subscribe a user to a feed
./rss2go user subscribe "subscriber@example.com" 1
# Unsubscribe a user
./rss2go user unsubscribe "subscriber@example.com" 1If metrics_addr is configured, you can view the internal state:
curl http://localhost:8080/metricsrss2go and its companion web scraper can be run together using Docker Compose.
docker-compose up -d --buildThe scraper service runs on http://scraper:8282. To subscribe to a site that doesn't have a native feed add code to the scraper command to support it.
Run the full test suite to ensure everything is working correctly:
go test -race ./...