Cabalmail

Host your own email and enhance your privacy

View the Project on GitHub cabalmail/cabal-infra

Compatibility and versioning

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.

Who this is for

Cabalmail is a self-hosted system rather than a library or a hosted service, so “compatibility” is a promise to three audiences:

Versioning rules

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.

Stable surfaces

From 1.0.0, the following are the public contract. A backward-incompatible change to any of them requires a major version bump.

1. HTTP API

The API Gateway + Lambda endpoints consumed by the clients:

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.

2. Authentication

Breaking: changing the authentication mechanism, the token format, or how the token is presented.

3. Mail service interface

These largely track the relevant email RFCs; the promise is that the endpoints, ports, and addressing model remain compatible within a major version.

4. Operator configuration

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.

5. Data durability and upgrade safety

The strongest guarantee. Within a major version:

A major version may require a migration; when it does, the steps are documented in that release’s notes.

Internal surfaces (not under the promise)

These may change in any release, including a patch. Do not build external integrations on them:

Deprecation policy

A stable element is removed only after a deprecation period:

  1. It is announced as deprecated in a minor release, via a Deprecated changelog entry and a note in the relevant docs.
  2. It keeps working for at least the remainder of the current major series.
  3. It is removed no earlier than the next major release.

Consumer responsibilities

Compatibility is a two-way contract. To stay compatible across minor and patch upgrades:

Security exception

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.