Changelog

Release notes for EDRI, grouped by user-facing impact. Expand the changed-file lists when you need implementation detail.

Note

Versions ending in rcN are release candidates. Their APIs and behavior may still change before the corresponding stable release.

How this changelog is generated

This page is generated from reachable Git tags, Conventional Commit subjects, and optional Changelog-* metadata. CI regenerates it before each documentation build.

Unreleased

In development 0 changes
No unreleased changes.

2026.10.03 — 2026-10-15

Stable 2 changes 1 breaking change
Fixed 1 Documentation 1

Fixed

Harden static file responses.

Static files are no longer served as text/html when their type is unknown, carry X-Content-Type-Options: nosniff, and accept only GET and HEAD.

  • Unknown and compressed (.gz) static files are served as application/octet-stream; CSS, JavaScript, fonts, images, and WebAssembly have a fixed Content-Type on every Python version and host.

Breaking change: Methods other than GET and HEAD on a static file return 405 instead of the file.

Documentation: Static files

3 changed files

Documentation

Document static file serving on its own page.

A new Static files page explains how unrouted URLs are served from EDRI_ASSETS_PATH, which routes and clients shadow them, what headers are sent, and why everything in the directory is public.

Documentation: Static files

7 changed files

2026.10.02 — 2026-10-13

Stable 2 changes
Fixed 2

Fixed

FilterBuilder negative filters on relationship paths

Negative FilterBuilder operators on dotted relationship paths now also match rows that have no related row.

  • not, doesNotContain, isNoneOf, notBetween, and isEmpty on a dotted path negate the positive EXISTS; on to-many and many-to-many paths they mean that no related row matches.

Documentation: SQLAlchemy integration

3 changed files

orm_validator() on SQLAlchemy 2.1

orm_validator() again rejects a column whose type has no known Python type when running on SQLAlchemy 2.1.

Documentation: SQLAlchemy integration

1 changed file

2026.10.01 — 2026-10-12

Stable 4 changes 2 breaking changes
Added 1 Changed 1 Fixed 2

Added

Add the edri new command.

Add the optional edri command; edri new creates a runnable project skeleton with one placeholder Manager.

Documentation: Getting Started

2 changed files

Changed

At-least-once delivery between Router and Switch

Events are kept by the Switch until the receiving Router acknowledges them, so a Router that reconnects no longer loses events that were still waiting for it. Delivery is at-least-once with de-duplication, and an acknowledgement means the event reached the next process, not that a manager finished handling it.

  • A replay requested with SendFrom for one router is no longer also sent to every subscriber, which delivered it twice.

Breaking change: The Connector-Switch wire protocol is version 2; a Switch and its Connectors on different versions refuse each other's frames.

Migration: Upgrade the Switch and every Connector together.

15 changed files

Fixed

Cache replay after a Switch outage

A Router now replays only the events it produced itself, and still replays what it has cached when the resume point has already expired. Previously the second case replayed nothing.

  • Events that already left every cache cannot be recovered, and a replay may deliver some events twice.

5 changed files

Run AsyncManagerBase start-up inside the event loop.

AsyncManagerBase runs its start-up, including after_start() and the events received while subscribing, inside the running event loop, so start-up events for async def handlers no longer crash the manager.

Breaking change: In AsyncManagerBase, after_start() now runs inside a running event loop, so calling asyncio.run() or loop.run_until_complete() there raises RuntimeError.

Migration: Make after_start() create tasks or loop-bound resources directly instead of running its own event loop.

Documentation: AsyncManagerBase

4 changed files

2026.09.08 — 2026-10-08

Stable 8 changes
Added 1 Changed 2 Fixed 5

Added

Add opt-in SQLite write-behind persistence.

Add optional SQLite persistence to the KV Store with asynchronous writes, startup restoration and TTL across restarts.

Documentation: Specialized managers

12 changed files

Changed

Restructure the SQLite persistence section.

Reorganize the Store SQLite persistence documentation into short, scannable subsections.

Documentation: Specialized managers

1 changed file

Document the start order of a persistent Store.

Document that a persistent Store should be started before the API, Broker, Scheduler and run().

Documentation: Specialized managers

1 changed file

Fixed

Exclude the health events from gRPC instead of warning.

EdriHealth and EdriReady are now declared as excluded from gRPC, so building the gRPC schema no longer logs a skip warning for each of them. EdriReady is also no longer offered over WebSocket, since its readiness signal is an HTTP 503.

3 changed files

Keep persistence failures observable and preserve Unicode keys.

Keep Store persistence failures observable, preserve surrogate-containing keys and avoid redundant missing-key deletes.

Documentation: Specialized managers

5 changed files

Snapshot updates and propagate persistence startup failures.

Snapshot Store persistence updates, invalidate stale data after serialization errors and propagate startup restoration failures to the application.

Documentation: Specialized managers

7 changed files

Preserve retry wakeups and recover batch preparation failures.

Preserve Store persistence retry wakeups, recover batch preparation failures and allow configurable restoration deadlines.

Documentation: Specialized managers

9 changed files

Enforce database ownership and recover stopped writers.

Enforce exclusive Store database ownership and recover stopped persistence writers without losing buffered commands.

Documentation: Specialized managers

5 changed files

2026.09.07 — 2026-10-06

Stable 1 change 1 breaking change
Fixed 1

Fixed

Treat unset ENVIRONMENT as production.

An unset or empty ENVIRONMENT is now treated as production instead of development, so a deployment that omits the variable no longer exposes /edri/docs, /edri/topology and error details.

Breaking change: ENVIRONMENT unset or empty now runs as production instead of development.

Migration: Set ENVIRONMENT=development explicitly for local development.

3 changed files

2026.09.06 — 2026-10-06

Stable 1 change 1 breaking change
Fixed 1

Fixed

Treat unrecognised ENVIRONMENT values as production.

An unrecognised ENVIRONMENT value such as "prod" is now treated as production instead of development, so /edri/docs, /edri/topology and error details are no longer exposed by a typo. A warning is logged at startup.

Breaking change: An ENVIRONMENT value other than "development", "production" or empty now runs as production.

Migration: Set ENVIRONMENT=development explicitly if the development behaviour is intended.

Documentation: Environment variables

3 changed files

Older releases

209 older releases
  1. 2026.09.05
  2. 2026.09.04
  3. 2026.09.03
  4. 2026.09.02
  5. 2026.09.01
  6. 2026.09.01rc6
  7. 2026.09.01rc5
  8. 2026.09.01rc4
  9. 2026.09.01rc3
  10. 2026.09.01rc2
  11. 2026.09.01rc1
  12. 2026.08.03rc2
  13. 2026.08.03rc1
  14. 2026.08.02
  15. 2026.08.02rc4
  16. 2026.08.02rc3
  17. 2026.08.02rc2
  18. 2026.08.02rc1
  19. 2026.08.01
  20. 2026.07.04
  21. 2026.07.03
  22. 2026.07.02
  23. 2026.07.02rc12
  24. 2026.07.02rc11
  25. 2026.07.02rc10
  26. 2026.07.02rc9
  27. 2026.07.02rc8
  28. 2026.07.02rc7
  29. 2026.07.02rc6
  30. 2026.07.02rc4
  31. 2026.07.02rc3
  32. 2026.07.01rc10
  33. 2026.07.01rc9
  34. 2026.07.01rc8
  35. 2026.07.01rc7
  36. 2026.07.01rc6
  37. 2026.07.01rc5
  38. 2026.07.01rc4
  39. 2026.07.01rc3
  40. 2026.07.01rc2
  41. 2026.07.01rc1
  42. 2026.06.01
  43. 2026.06.01rc5
  44. 2026.06.01rc4
  45. 2026.06.01rc3
  46. 2026.06.01rc2
  47. 2026.06.01rc1
  48. 2026.03.03
  49. 2026.03.03rc5
  50. 2026.03.03rc4
  51. 2026.03.03rc3
  52. 2026.03.03rc2
  53. 2026.03.03rc1
  54. 2026.03.02
  55. 2026.03.01
  56. 2026.02.03
  57. 2026.02.02
  58. 2026.02.01
  59. 2025.12.03
  60. 2025.12.03rc1
  61. 2025.12.02
  62. 2025.12.02rc1
  63. 2025.12.01
  64. 2025.12.01rc3
  65. 2025.12.01rc2
  66. 2025.12.01rc1
  67. 2025.11.01rc4
  68. 2025.11.01rc3
  69. 2025.11.01rc2
  70. 2025.11.01rc1
  71. 2025.10.02rc1
  72. 2025.10.01
  73. 2025.10.01rc1
  74. 2025.09.04rc2
  75. 2025.09.04rc1
  76. 2025.09.03
  77. 2025.09.03rc1
  78. 2025.09.02
  79. 2025.09.02rc7
  80. 2025.09.02rc6
  81. 2025.09.02rc5
  82. 2025.09.02rc4
  83. 2025.09.02rc3
  84. 2025.09.02rc2
  85. 2025.09.02rc1
  86. 2025.09.01
  87. 2025.08.03rc4
  88. 2025.08.03rc3
  89. 2025.08.03rc2
  90. 2025.08.03rc1
  91. 2025.08.02rc4
  92. 2025.08.02rc3
  93. 2025.08.01
  94. 2025.07.02
  95. 2025.07.02rc3
  96. 2025.07.02rc2
  97. 2025.07.02rc1
  98. 2025.07.01
  99. 2025.07.01rc4
  100. 2025.07.01rc3
  101. 2025.07.01rc2
  102. 2025.07.01rc1
  103. 2025.06.01
  104. 2025.04.05
  105. 2025.04.04
  106. 2025.04.03
  107. 2025.04.02
  108. 2025.04.01
  109. 2025.04.01rc4
  110. 2025.04.01rc3
  111. 2025.04.01rc2
  112. 2025.04.01rc1
  113. 2025.03.03
  114. 2025.03.03rc7
  115. 2025.03.03rc6
  116. 2025.03.03rc5
  117. 2025.03.03rc4
  118. 2025.03.03rc3
  119. 2025.03.03rc2
  120. 2025.03.03RC1
  121. 2025.03.02
  122. 2025.03.02rc5
  123. 2025.03.02rc4
  124. 2025.03.02rc3
  125. 2025.03.02rc2
  126. 2025.03.02rc1
  127. 2025.03.01
  128. 2025.03.01rc6
  129. 2025.03.01rc5
  130. 2025.03.01rc4
  131. 2025.03.01rc3
  132. 2025.03.01rc2
  133. 2025.03.01rc1
  134. 2025.02.02
  135. 2025.02.01
  136. 2025.01.05
  137. 2025.01.04
  138. 2025.01.03
  139. 2025.01.02
  140. 2025.01.01
  141. 2024.12.08
  142. 2024.12.07
  143. 2024.12.06
  144. 2024.12.05
  145. 2024.12.04
  146. 2024.12.03
  147. 2024.12.02
  148. 2024.12.01
  149. 2024.12.0
  150. 2024.11.15
  151. 2024.11.14
  152. 2024.11.13
  153. 2024.11.12
  154. 2024.11.11
  155. 2024.11.10
  156. 2024.11.09
  157. 2024.11.08
  158. 2024.11.07
  159. 2024.11.06
  160. 2024.11.05
  161. 2024.11.04
  162. 2024.11.03
  163. 2024.11.02
  164. 2024.11.01
  165. 2024.10.16
  166. 2024.10.15
  167. 2024.10.14
  168. 2024.10.13
  169. 2024.10.12
  170. 2024.10.11
  171. 2024.10.10
  172. 2024.10.09
  173. 2024.10.08
  174. 2024.10.07
  175. 2024.10.05
  176. 2024.10.04
  177. 2024.10.03
  178. 2024.10.02
  179. 2024.10.01
  180. 2024.09.13
  181. 2024.09.12
  182. 2024.09.11
  183. 2024.09.10
  184. 2024.09.09
  185. 2024.09.08
  186. 2024.09.07
  187. 2024.09.06
  188. 2024.09.05
  189. 2024.09.04
  190. 2024.09.03
  191. 2024.09.02
  192. 2024.09.01
  193. 2024.06.04
  194. 2024.06.03
  195. 2024.06.02
  196. 2024.06.01
  197. 2024.04.01
  198. 2024.03.11
  199. 2024.03.10
  200. 2024.03.09
  201. 2024.03.08
  202. 2024.03.07
  203. 2024.03.06
  204. 2024.03.05
  205. 2024.03.04
  206. 2024.03.03
  207. 2024.03.02
  208. 2024.03.01
  209. 2024.02.01