diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53cb335cb..9048aa07d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,84 @@
# Changelog
+## [1.40.0] — 2026-10-04
+
+Back up the encryption key and refuse a key that cannot open the data;
+several courses and custom categories for medications; custom symptoms;
+document reads in the background; sick notes; lab unit refusal and charts
+that follow the source priority; blood pressure no longer loses its
+diastolic value; document previews work again.
+
+### Added
+
+- **Encryption key backup step (migration 0365).** Admin step with key id,
+ fingerprint and per-platform guidance (`HEALTHLOG_PLATFORM`), an optional
+ "check my copy" that compares and discards the pasted key, a reminder that
+ returns when the key changes.
+- **Boot key check.** A canary per key id, probed oldest values first across
+ string and Bytes columns; a proven mismatch answers 503
+ `encryption.key_mismatch` everywhere except `/api/health` and
+ `/api/version`, MCP included, and starts no worker; an unproven result
+ serves, warns and re-checks. `ENCRYPTION_KEY_CHECK=warn` as a last resort.
+- **Medication courses and custom categories (#1024, #1041, migration
+ 0368).** Several courses per medication; compliance, streak, cadence and
+ dose history count every course and never the gaps; existing dated
+ medications become one course each. Own categories as `custom: