Skip to content

Posthorn

v1.0.0 Feature

This release adds 3 notable features for engineering teams evaluating rollout.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

docker email email-gateway go self-hosted mail-gateway
+3 more
postmark smtp-relay transactional-email

Summary

AI summary

Updates Highlights, Links, and https://posthorn.dev/recipes/contact-form/ across a mixed release.

Full changelog

Posthorn is the unified outbound mail layer for self-hosted projects — one gateway between your apps and your transactional mail provider.

One container. One TOML config. One set of credentials. Apps point at Posthorn, Posthorn points at your provider.

Highlights

  • Three ingress shapes — HTTP form (contact forms on static sites), HTTP API with Bearer auth + idempotency (server-to-server callers), and an SMTP listener (Ghost, Gitea, Mastodon, Matrix, NextCloud, Authentik — anything that only speaks SMTP, including on cloud hosts that block outbound 25/465/587).
  • Five transports — Postmark, Resend, Mailgun, AWS SES, and outbound-SMTP relay. Provider is a config field; switching is one line and a container restart.
  • Bespoke clients, no SDKs — every transport is a 200–300-line stdlib HTTP client. Three external dependencies in the entire Go module: a TOML parser, a UUID library, an LRU cache.
  • Security primitives in by default — structured-JSON header construction (submitter input can't become headers), honeypot 200s that are byte-identical to real successes, fail-closed Origin checks, bounded-memory token-bucket rate limiter, per-IP brute-force defense on API endpoints, API keys that are header values only and never logged.
  • Operational surface — `/healthz`, `/metrics` (hand-rolled Prometheus exposition, no `prometheus/client_golang` dep), structured JSON logs with UUID submission IDs and `transport_message_id` for jumping to the provider's UI, dry-run mode, CSRF tokens, IP-stripping, named `trusted_proxies` presets.

Get it

```bash
docker pull ghcr.io/craigmccaskill/posthorn:v1.0.0
```

Multi-arch image: `linux/amd64` + `linux/arm64`.

Ten-minute walkthrough from `docker compose up` to a working contact form: posthorn.dev/recipes/contact-form.

What's not in v1.0

No persistent storage — a send that exhausts both retries is gone except for the log line. Durable retry across restarts is on the roadmap. Suppression lists, lifecycle webhooks, HTML body, attachments → all v2.

Links

Apache-2.0. Bug reports and feature requests: Issues.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track Posthorn

Get notified when new releases ship.

Sign up free

About Posthorn

All releases →

Related context

Beta — feedback welcome: [email protected]