selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

GitHub
goeland logo

Self-host goeland

v0.29.2

RSS to email digest generator

ReleaseOpen SourceMIT
Updatedlast week
LanguageGo
Setup difficultyModerate
Stars
205
Docker
slurdge/goeland
Install with Docker
Example email digest showing Phoronix feed transformed into HTML emailExample email digest showing merged Instagram and Imgur puppy photos

What is goeland?

Goeland is a self-hosted application that fetches RSS, Atom, and JSON feeds (plus Imgur tags and Miniflux instances) and transforms them into beautiful, responsive HTML email digests. It includes over 20 composable filters for selecting, transforming, and combining feed entries — such as keeping only unseen items, fetching full article content, filtering by language, and creating digest emails. A built-in scheduler runs pipes on per-pipe cron schedules in daemon mode, so no external cron is needed. It runs as a single Docker container or binary with a TOML configuration file, stores unseen-entry state in a local SQLite database, and sends emails via SMTP with TLS support. The project is written in Go and licensed under MIT.

Should you self-host goeland?

goeland scores 48/100 on selfhost.directory (how scoring works) and ranks #65 of 106 in Email. It has 205 GitHub stars.

It shipped 10 stable releases in the past year. The latest, v0.29.2, came out on 30 August 2026. New versions land roughly every 2 weeks.

Setup is moderate: expect some configuration beyond a single command. An official Docker image is available. It is MIT-licensed and written mostly in Go.

Its closest alternative on selfhost.directory is Listmonk (80/100, 24 017 stars). It scores higher overall, so compare the two before you pick. See goeland vs Listmonk side by side.

Features

  • Beautiful HTML emails
  • Built-in scheduler
  • Composable filters
  • Custom email templates
  • Docker-native deployment
  • Full-Text Extraction
  • Imgur tag support
  • Multiple source types
  • Rate Limiting
  • RSS/Atom/JSON feed parsing
  • Zero cloud dependency

goeland README

How to install goeland

Install goeland with Docker

Environment variables
All config values can be set via environment variables (e.g. GOELAND_EMAIL_PASSWORD_FILE=/path/to/pass)

docker run -v ./config.toml:/data/config.toml slurdge/goeland

or

docker run -v ./config.toml:/data/config.toml ghcr.io/slurdge/goeland

Mount config.toml and optionally goeland.db for persistence

How to configure goeland

  • allow-insecurefalseAllow insecure TLS connections

    Allow insecure TLS connections

    values: true|false

  • api-tokenOverride global miniflux-api-token for this source

    Override global miniflux-api-token for this source

  • authenticationplainSMTP authentication type

    SMTP authentication type

    values: none|plain|login|crammd5

  • auto-purgefalseAutomatically run purge command after run command

    Automatically run purge command after run command

    values: true|false

  • cronCron schedule for this pipe (standard cron or Go duration)

    Cron schedule for this pipe (standard cron or Go duration)

  • destinationDestination type: email, terminal, or htmlfile

    Destination type: email, terminal, or htmlfile

    values: email|terminal|htmlfile

  • disabledfalseDisable this pipe without removing it

    Disable this pipe without removing it

    values: true|false

  • dry-runfalseDo not output anything or send email after fetching sources

    Do not output anything or send email after fetching sources

    values: true|false

  • email_bccBCC email addresses

    BCC email addresses

  • email_ccCC email addresses

    CC email addresses

  • email_fromSender email address

    Sender email address

  • email_replytoReply-to email address

    Reply-to email address

  • email_title{{.EntryTitle}}Email subject template

    Email subject template

  • email_toRecipient email addresses

    Recipient email addresses

  • encryptiontlsSMTP encryption type

    SMTP encryption type

    values: tls|ssl|none

  • filename{{.Pipe}} - {{.EntryNumber}}.htmlFilename template for HTML files (Go template)

    Filename template for HTML files (Go template)

  • filtersList of filters to apply to source entries

    List of filters to apply to source entries

  • hostsmtp.example.comSMTP server host

    SMTP server host

  • htmlfile.filename{{.Pipe}} - {{.EntryNumber}}.htmlFilename template for HTML files (Go template)

    Filename template for HTML files (Go template)

  • htmlfile_filenameOverride htmlfile.filename for this pipe

    Override htmlfile.filename for this pipe

  • htmlfile.pathdataOutput directory for HTML files

    Output directory for HTML files

  • htmlfile_pathOverride htmlfile.path for this pipe

    Override htmlfile.path for this pipe

  • include-footertrueInclude 'Sent with ❤️ by goeland' in emails

    Include 'Sent with ❤️ by goeland' in emails

    values: true|false

  • include-headertrueInclude goeland logo in emails

    Include goeland logo in emails

    values: true|false

  • include-titlefalseInclude title in email header

    Include title in email header

    values: true|false

  • localeenLocale for output (en or fr)

    Locale for output (en or fr)

    values: en|fr

  • loglevelnoneLog level: none, error, warning, info, debug, or trace

    Log level: none, error, warning, info, debug, or trace

    values: none|error|warning|info|debug|trace

  • logointernal:goeland.pngLogo file for emails (internal:goeland.png or path)

    Logo file for emails (internal:goeland.png or path)

  • mark-as-readfalseMark fetched entries as read in Miniflux

    Mark fetched entries as read in Miniflux

    values: true|false

  • miniflux-api-tokenMiniflux API token for miniflux source type

    Miniflux API token for miniflux source type

  • passwordpassSMTP password

    SMTP password

  • pathdataOutput directory for HTML files

    Output directory for HTML files

  • plaintext-onlyfalseExclude HTML version of email

    Exclude HTML version of email

    values: true|false

  • port587SMTP server port

    SMTP server port

  • purge-days15Number of days to keep entries when purge command is used

    Number of days to keep entries when purge command is used

  • run-at-startupfalseRun all pipes once at startup in daemon mode

    Run all pipes once at startup in daemon mode

    values: true|false

  • sleep-interval0sWait between each source fetch to avoid rate limiting (Go duration format)

    Wait between each source fetch to avoid rate limiting (Go duration format)

  • sourceSource name to use for this pipe

    Source name to use for this pipe

  • tagImgur tag for imgur source type

    Imgur tag for imgur source type

  • templateCustom HTML email template path

    Custom HTML email template path

  • timeout-ms5000Email timeout in milliseconds

    Email timeout in milliseconds

  • typeSource type: feed, imgur, miniflux, or merge

    Source type: feed, imgur, miniflux, or merge

    values: feed|imgur|miniflux|merge

  • unsafe-no-sanitize-filterfalseDo not sanitize input (use at your own risk)

    Do not sanitize input (use at your own risk)

    values: true|false

  • urlURL for feed or miniflux source

    URL for feed or miniflux source

  • user-agentmultiple:goelandOverride the user agent string

    Override the user agent string

  • usernameuserSMTP username

    SMTP username

goeland releases & version history

More in Feed Reader

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…