-
v1.1.0
StableRelease / build (amd64, freebsd) (push) Successful in 56sRelease / build (amd64, linux) (push) Successful in 58sRelease / build (arm64, freebsd) (push) Successful in 58sRelease / build (arm64, linux) (push) Successful in 58sRelease / build (loong64, linux) (push) Successful in 1m3sRelease / build (riscv64, freebsd) (push) Successful in 1m1sRelease / build (riscv64, linux) (push) Successful in 1m1sRelease / release (push) Successful in 20sreleased this
2026-07-26 19:48:22 +00:00 | 0 commits to main since this releaseAdded
- RISC-V and LoongArch builds — CI now produces binaries for
linux/riscv64,
linux/loong64, andfreebsd/riscv64in addition to the existing four
targets. - 80 % coverage gate —
just testand CI enforce ≥ 80 % test coverage on
internal/andpkg/packages. - Handler and email test suites — 22 handler tests covering CORS, rate
limiting, validation, honeypot, and send/store paths via mock interfaces.
12 email composition tests covering all four form types.
Changed
- Module migrated to sourcedock.dev — all imports and documentation now
referencesourcedock.dev/petrbalvin/nuntius. - CI migrated from Forgejo to Gitea — workflows now live in
.gitea/workflows/, run on thefedorarunner, and use the standard
actions/*short form. - Dependency bump —
interpresupdated to v1.1.1. - IPv6-first — the server now binds
[::]:portfor explicit dual-stack. - Installer rewritten in Python —
install.pyreplacesinstall.sh. - nginx → Caddy — all documentation and the installer now use Caddy as the
recommended reverse proxy.
Fixed
- Rate limiter memory leak — a periodic cleanup goroutine removes expired
IP entries from the token-bucket map. - Silent template errors —
compose()now produces a fallback HTML message
instead of silently discarding template execution errors. - Silent JSON encoding errors — all
json.NewEncoder(w).Encode()calls now
log errors instead of discarding them. - CI formatting gate —
gofmt -lin the test workflow now actually fails
when it finds unformatted files. - Missing
just fmtrecipe — addedgofmt -wtarget. - Copyright headers — added to all Go and Python source files.
- Smoke test restricted to native builds — cross-compiled binaries now
skip the smoke test step since they cannot execute on the Linux amd64 CI
runner.
Downloads
- RISC-V and LoongArch builds — CI now produces binaries for
-
v1.0.0 Stable
released this
2026-06-20 18:48:09 +00:00 | 16 commits to main since this releaseFirst stable release of nuntius: a small, opinionated, modular contact form
backend written in Go. A single static binary, four form kinds out of the box,
SMTP delivery, a JSONL newsletter log, strict TOML configuration, and env-var
secrets. Its only dependency outside the standard library is the first-party
interpres TOML parser.Added
- Server —
cmd/server, the HTTP entry point.http.Serverwith explicit
ReadHeaderTimeout(10 s),ReadTimeout(15 s),WriteTimeout(30 s), and
IdleTimeout(60 s). Graceful shutdown onSIGINT/SIGTERMwith a 15 s
budget. Structured logging vialog/slog(JSON handler, INFO level, stdout)
with one log line per request.GET /healthendpoint.--versionflag. - Four form kinds —
contact,feedback,newsletter, andgeneric, each
with its own endpoint, per-IP rate limit, CORS allowlist, and honeypot field.
OnePOST+ oneOPTIONShandler per form on a freshhttp.ServeMux. - SMTP delivery — stdlib
net/smtpwithPLAINauth,multipart/alternative
HTML + plain text bodies, one dedicated template per form type. - Newsletter JSONL log — append-only
data_dir/newsletter-<name>.jsonlwith
crash-safeO_APPENDwrites;CountandListskip malformed lines. pkg/contactform— public Go package withRequest/Response/
FieldError/ErrorResponsetypes and aValidatefunction for all four
form types.- Per-IP rate limiting — in-memory token bucket per form, configurable per
hour. - Per-form honeypot — silent 200 on bot fill, no mail, no subscriber line.
- Per-form CORS — allowlist enforced on preflight and actual requests, with
echoedAccess-Control-Allow-Origin+Vary: Origin. - TOML configuration — parsed by the first-party
interpreslibrary, with
strict unknown-field rejection and per-type validation that fails loud on
typos at startup. - Env-var secrets —
${VAR_NAME}/$VAR_NAMEexpansion before the config
is parsed, so SMTP passwords never live in the file. - Auto-generated config — a three-form TOML template is written to
/etc/nuntius/config.tomlon first start. - systemd unit — installed inline from
docs/deployment.mdwith
Restart=on-failureandEnvironmentFile=. - Install script —
install.sh, idempotent, handles user creation, config
generation, and secrets file mode0600. - docs/ —
architecture.md,configuration.md,api-reference.md,
deployment.md,security.md,library-usage.md.
Downloads
- Server —