$ show slurdge/goeland
Goeland is a self-hosted RSS/Atom feed to email digest tool written in Go. It fetches feeds from RSS/Atom/JSON sources, Imgur tags, and Miniflux instances, applies a composable chain of filters (e.g., unseen, today, digest, language, retrieve, replace), and sends beautiful responsive HTML emails via SMTP or writes to HTML files. It runs as a one-shot CLI command or as a persistent daemon with per-pipe cron scheduling. The architecture is modular: commands are defined with Cobra, configuration is read via Viper (TOML files with env overrides), logging uses Logrus with structured output support, and unseen entry tracking uses BoltDB. External dependencies include an SMTP server, Miniflux REST API, Imgur API, and optional CSS themes. The codebase demonstrates strong engineering practices: clean package boundaries, thorough unit tests (filter_test.go covers all filters including edge cases), security-conscious HTTP fetching with SSRF protection, internationalization support, and automated CI/CD with Docker multi-arch builds. It is production-stable and actively maintained.
The LLM identified 2 files worth highlighting for reuse:
Implements a composable filter pipeline where each filter is a registered function with a standard signature (source + params). The FilterSource function iterates over configured filter names, parses arguments, and executes each filter in order. This pattern is reusable for any Go application needing a chain of data transformations, independent of Goeland's RSS domain. The design supports arbitrary filters with optional numeric/string arguments, debug logging of entry counts, and graceful handling of unknown filters.
Provides a hardened HTTP client that validates URLs (only http/https, non-empty host), blocks requests to private/reserved IP addresses (SSRF mitigation), and supports custom user-agents. The insecure variant allows self-signed certificates. This package is a reusable security utility for any Go service that fetches external resources, as it prevents common SSRF vulnerabilities and can be adapted with different validation rules.