Host your own email and enhance your privacy
Cabalmail follows Semantic Versioning 2.0.0. This document defines what that means in practice: which parts of the system are a stable, versioned contract, what counts as a breaking change, and how deprecations and upgrades are handled.
These guarantees take effect at 1.0.0. Releases in the 0.x series carried
no compatibility guarantees - anything could change between them.
Cabalmail is a self-hosted system rather than a library or a hosted service, so “compatibility” is a promise to three audiences:
Given a version MAJOR.MINOR.PATCH:
Version numbers only increase and are never reused. Pre-release identifiers (for
example 1.0.0-rc.1) may be used for testing and carry no stability guarantee.
From 1.0.0, the following are the public contract. A backward-incompatible change to any of them requires a major version bump.
The API Gateway + Lambda endpoints consumed by the clients:
503 planned-maintenance contract
(Retry-After, {"status": "maintenance", ...})./ in requests and are
normalized internally).Breaking: removing or renaming an endpoint or a response field, changing a field’s type or meaning, making a previously optional request parameter required, or changing the authentication scheme.
Non-breaking (minor): adding an endpoint, adding a response field, or accepting a new optional parameter. Clients must ignore unknown fields and tolerate new endpoints and values so that these additions stay non-breaking.
Authorization header.Breaking: changing the authentication mechanism, the token format, or how the token is presented.
These largely track the relevant email RFCs; the promise is that the endpoints, ports, and addressing model remain compatible within a major version.
TF_VAR_* input variables and their meaning and defaults.main/stage/development) and the deploy
model.Breaking: removing or renaming a documented variable, or changing a variable’s meaning or default such that an existing deployment’s behavior changes or manual intervention is required.
The strongest guarantee. Within a major version:
503).A major version may require a migration; when it does, the steps are documented in that release’s notes.
These may change in any release, including a patch. Do not build external integrations on them:
config.js schema (the app
and its config are versioned together).A stable element is removed only after a deprecation period:
Deprecated
changelog entry and a note in the relevant docs.Compatibility is a two-way contract. To stay compatible across minor and patch upgrades:
Changed, Deprecated, and
Removed sections and the release notes before upgrading, especially across a
major.A fix for a serious security issue may require a change that is technically
breaking. Such a change can ship in a minor or patch release when withholding it
would leave deployments exposed. It is always called out in the Security
changelog section and the release notes, with any action an operator must take.