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>
108 lines
5.2 KiB
Markdown
108 lines
5.2 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to LambdaMail are listed here. The format follows
|
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project follows
|
|
[Semantic Versioning](https://semver.org/).
|
|
|
|
[Português](CHANGELOG.pt-BR.md)
|
|
|
|
## [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](README.md#what-is-not-finished).
|
|
|
|
### Mail server
|
|
|
|
- SMTP MX and Submission (587 STARTTLS, 465 implicit TLS), IMAP with UID, flags,
|
|
IDLE, CONDSTORE, `SEARCH`, `EXPUNGE`, `COPY` and `MOVE`, 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`, `c` and `/` 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) or `acme`.
|
|
|
|
### 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-mfa` recovers 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: `next` 15.5.28
|
|
(unauthenticated remote code execution in image optimisation,
|
|
GHSA-2464-fhr4-w9xw) and `go-jose` 4.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 on `git.lucasrguerra.dev.br`; the images are
|
|
published for `linux/amd64` and `linux/arm64` under
|
|
`git.lucasrguerra.dev.br/lucasrguerra/lambdamail/<service>` and the `v*` tag
|
|
creates a release with notes. See [docs/RELEASING.md](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.example` for development and production, and `scripts/init-env.sh`
|
|
to create `.env` with random secrets (`make env`). It replaces
|
|
`.env.production.example`.
|
|
|
|
### Fixed
|
|
|
|
- Webmail healthcheck: Next binds IPv4 only and `wget` resolved `localhost` to
|
|
`::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`.
|
|
|
|
[Unreleased]: https://git.lucasrguerra.dev.br/lucasrguerra/LambdaMail/compare/v1.0.0...HEAD
|
|
[1.0.0]: https://git.lucasrguerra.dev.br/lucasrguerra/LambdaMail/releases/tag/v1.0.0
|