Release hashes services/, migrations/ and config/; when images for that hash already exist it skips CI and the build and only applies the new tags. Tagging a release no longer recompiles the webmail. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
5.2 KiB
5.2 KiB
Changelog
All notable changes to LambdaMail are listed here. The format follows Keep a Changelog and the project follows Semantic Versioning.
Unreleased
1.0.0 - 2026-10-30
The first tagged release. Earlier work was never tagged, so this entry sums up everything from the first commit on 2026-07-23 to the move to Gitea. Gaps that remain are listed in the README under What is not finished.
Mail server
- SMTP MX and Submission (587 STARTTLS, 465 implicit TLS), IMAP with UID, flags,
IDLE, CONDSTORE,
SEARCH,EXPUNGE,COPYandMOVE, POP3 and ManageSieve. - SPF, DKIM (Ed25519 and RSA dual signature), DMARC, ARC sealing, MTA-STS and DANE on delivery, and TLS-RPT report ingestion.
- Rspamd scoring with greylisting, RBLs and rate limiting, and ClamAV.
- A durable outbound queue in Postgres with the retry ladder and RFC 3464
bounces, a smarthost fallback for hosts with port 25 blocked, and a
configurable SPF term for the relay (
RELAY_SPF_INCLUDE). - Mail addressed to this server is delivered locally instead of going out to the internet and back.
- Every submitted message is kept in the sender's Sent folder; app passwords sign in over SMTP, IMAP and POP3.
- Sieve rules evaluated at delivery, custom folders, and an RFC 5230 vacation responder that replies in thread and once per sender per week.
Webmail and console
- A complete redesign of both surfaces (the "Nocturne" interface): dark and light
themes, a command menu on
Ctrl K/Cmd K,cand/shortcuts, an installable app with its own icon, and a drawn logo. - Conversations in cascade, with who wrote, how many, and whether you have answered; reply, reply all, important mail, undo send, and drafts that replace the previous autosave.
- A reader that suits both themes: plain messages take the app's colours, designed ones keep their white sheet, quoted history folds away, remote images are blocked until allowed.
- Trusted senders, kept on the server per mailbox: their mail skips spam and always shows images.
- Webmail sessions of 30 days that renew while used, several accounts signed in at once and switchable from the sidebar; the console stays at 8 hours.
- Profile photos with a circular crop editor, and per-domain BIMI logo hosting and validation, published to DNS and kept in step with the logo.
- Admin console with server-side paging and filtering, user editing (role, quota, language, password, second factor), aliases, a diagnostics page, and isolation between the user and admin surfaces. Domain admins are confined to their own domain.
- English, Portuguese and Spanish, with a test that every string exists in all of them.
DNS and TLS
- Cloudflare reconciliation of the expected records for every active domain, idempotent, with per-record verification against public resolvers; a DKIM record is never published with an empty key.
- A TLS panel that states the digest the TLSA record must carry, and documented
steps for turning DANE on.
TLS_MODE=traefik(default) oracme.
Security
- Two-factor sign-in with TOTP and recovery codes; enrolment can no longer
replace a secret the authenticator already has, enable MFA without recovery
codes, or kill the auth service.
make reset-mfarecovers a broken enrolment. - Argon2 concurrency is bounded, so a login flood cannot take the auth service down.
- All service containers run as non-root; images are scanned with Trivy and the build fails on HIGH or CRITICAL findings.
- Dependencies updated for two published advisories:
next15.5.28 (unauthenticated remote code execution in image optimisation, GHSA-2464-fhr4-w9xw) andgo-jose4.1.6 (denial of service).
Deployment and CI
- The deploy host pulls images that CI built and tested; nothing is compiled on the server. The compose file pins Traefik to the proxy network by name.
- Moved to Gitea. The source, the workflows (
.gitea/workflows) and the container images now live ongit.lucasrguerra.dev.br; the images are published forlinux/amd64andlinux/arm64undergit.lucasrguerra.dev.br/lucasrguerra/lambdamail/<service>and thev*tag creates a release with notes. See docs/RELEASING.md. - CI caches npm, Go modules, the embedded Postgres, Trivy's database and image
layers. Release recognises images it already published for the same sources
(
inputs-<hash>tag), so a documentation change or a version tag never rebuilds them. - One
.env.examplefor development and production, andscripts/init-env.shto create.envwith random secrets (make env). It replaces.env.production.example.
Fixed
- Webmail healthcheck: Next binds IPv4 only and
wgetresolvedlocalhostto::1. - The admin lockout, a draft that did not discard, folder counters, a vacation reply that was not a reply, DNS panels that reported published records as missing, and the reconcile button that created nothing.
- Migrations: a default partition for
email_messages.