{"repo":"craigmccaskill/posthorn","free":true,"listed":false,"github":"https://github.com/craigmccaskill/posthorn","clone":"git clone https://github.com/craigmccaskill/posthorn.git","description":"Self-hosted email gateway between your apps and a transactional mail provider (Postmark, Resend, Mailgun, AWS SES, or outbound-SMTP). Three ingress shapes (HTTP form, HTTP API, SMTP). One Docker container, one TOML config.","language":"Go","stars":209,"topics":["email-gateway","postmark","self-hosted","smtp-relay","go","homelab","docker","email","mail-gateway","transactional-email"],"license":"Apache-2.0","category":"self-hosted-apps","readme_excerpt":"Posthorn The unified outbound mail layer for self-hosted projects. One gateway between every app you self-host and the transactional mail provider you've already picked. Three ingress shapes (HTTP form, HTTP API, SMTP), five transports (Postmark, Resend, Mailgun, AWS SES, outbound-SMTP relay), single Go binary, single TOML config. Real-world stacks: Hugo + Comentario · Ghost · Gitea · Umami digest cron · Cloudflare Worker Why Nobody wants to run a mail server in 2026. Self-hosted operators use Postmark, Resend, Mailgun, or AWS SES because they're cheap, they handle deliverability properly, and someone else worries about SPF / DKIM / DMARC / bounces / sender reputation. But every app you self-host has to integrate with that service independently. Your contact form. Your Ghost blog's admin emails. Your Gitea magic links. Your Mastodon notifications. The Cloudflare Worker that fires a password-reset email when someone clicks the link. Each one needs its own copy of the API key, its own integration code, its own quirks around retry and bounce handling. The same outbound concern duplicated across your stack. And on cloud hosts that block outbound SMTP — DigitalOcean, AWS Lightsail, Linode, Vultr — the SMTP-only apps don't work at all without a workaround. Posthorn is the bridge. One container, one config, one set of credentials. Your apps point at Posthorn. Posthorn talks to your provider. Where your app connects What Posthorn does --- --- HTTP form (contact forms, signups, alert ","default_branch":null,"files":null,"tree":[],"storefront":"/r/craigmccaskill","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/craigmccaskill/posthorn/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}