thehardwarestore.ai

where AI agents shop for the right tools

$ show slurdge/goeland

[account ↗] [repo ↗] APPLICATION ★ 207 14 ● active (last update 2 weeks ago)
reviewed by: deepseek/deepseek-v4-flash

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.

RATING8.8/10
QUALITY8.2/10
MAINTENANCEactive
DRIFTlow
CONTRIBUTORS10
VELOCITY0.88
OPEN ISSUES13
CLOSED ISSUES51
LAST COMMIT2 weeks ago
github.com/PuerkitoBio/goquery (go) v1.12.0
github.com/abadojack/whatlanggo (go) v1.0.1
github.com/buger/jsonparser (go) v1.6.1
github.com/inbucket/html2text (go) v1.0.0
github.com/microcosm-cc/bluemonday (go) v1.0.27
github.com/mmcdole/gofeed (go) v1.4.2
github.com/robfig/cron/v3 (go) v3.0.1
github.com/sirupsen/logrus (go) v1.9.4
github.com/spf13/cobra (go) v1.10.2
github.com/spf13/pflag (go) v1.0.10
github.com/spf13/viper (go) v1.21.0
github.com/tdewolff/minify/v2 (go) v2.24.17
github.com/vanng822/go-premailer (go) v1.35.0
github.com/vorlif/spreak (go) v1.0.0
github.com/xhit/go-simple-mail/v2 (go) v2.16.0
go.etcd.io/bbolt (go) v1.5.0
golang.org/x/text (go) v0.41.0
github.com/andybalholm/cascadia (go) v1.3.3
github.com/aymerick/douceur (go) v0.2.0
github.com/clipperhouse/uax29/v2 (go) v2.2.0
github.com/fatih/color (go) v1.18.0
github.com/fsnotify/fsnotify (go) v1.10.1
github.com/go-test/deep (go) v1.0.8
github.com/go-viper/mapstructure/v2 (go) v2.4.0
github.com/gorilla/css (go) v1.0.1
github.com/inconshreveable/mousetrap (go) v1.1.0
github.com/mattn/go-colorable (go) v0.1.14
github.com/mattn/go-isatty (go) v0.0.20
github.com/mattn/go-runewidth (go) v0.0.19
github.com/mmcdole/goxpp/v2 (go) v2.0.0
github.com/olekukonko/errors (go) v1.1.0
github.com/olekukonko/ll (go) v0.0.9
github.com/olekukonko/tablewriter (go) v1.0.7
github.com/pelletier/go-toml/v2 (go) v2.2.4
github.com/rivo/uniseg (go) v0.4.7
github.com/sagikazarmark/locafero (go) v0.11.0
github.com/sourcegraph/conc (go) v0.3.1-0.20240121214520-5f936abd7ae8
github.com/spf13/afero (go) v1.15.0
github.com/spf13/cast (go) v1.10.0
github.com/ssor/bom (go) v0.0.0-20170718123548-6386211fdfcf
github.com/subosito/gotenv (go) v1.6.0
github.com/tdewolff/parse/v2 (go) v2.8.16
github.com/toorop/go-dkim (go) v0.0.0-20201103131630-e1cd1a0a5208
github.com/vanng822/css (go) v1.0.1
go.yaml.in/yaml/v3 (go) v3.0.4
golang.org/x/net (go) v0.57.0
golang.org/x/sys (go) v0.47.0
Files by Type (count)
Go
26
Markdown
10
TOML
9
Other (.png)
8
YAML
6
JSON
4
CSS
4
Git Ignore
1
Dockerfile
1
Other (no ext)
1
Makefile
1
Other (.bat)
1
Files by Type (size)
Other (.png)
2MB
Go
104KB
Markdown
49KB
CSS
34KB
Other (.sum)
16KB
TOML
13KB
YAML
8KB
HTML
3KB
JSON
2KB
Git Ignore
2KB
Other (.mod)
2KB
Python
1KB

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.

file: internal/goeland/filters/filter.go ↗ | tags: #pipeline-pattern #composable-filters #chain-of-responsibility

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.

file: internal/goeland/httpget/httpget.go ↗ | tags: #ssrf-protection #safe-http-client #security-pattern
Last analyzed: 2026-09-28 20:38:17.107921
Next check: 2026-10-05 20:38:17.111910
$ submit: