# NATS changelog > A connective technology for cloud, edge and IoT messaging. - Vendor: Synadia - Category: Infrastructure & DevOps - License: Apache-2.0 - Language: Go - Official site: https://nats.io - Tracked by: What's New (https://whatsnew.fyi/product/nats) - Harvested from: GitHub (nats-io/nats-server) - Entries below: 25 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### v2.15.1 — Release v2.15.1 - Date: 2026-10-09 - Version: v2.15.1 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.1 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.15.1 - **changed** — The max_ha_assets limit is now enforced consistently by the metalayer leader during stream and consumer placement, scaling and moves - **changed** — Support for sending and handling the legacy $GR. reply prefix, used by servers prior to v2.1.2, has been removed - **changed** — Stalled source and mirror flow control is now reported in stream info and warning logs, making missing $JS.FC.> imports or exports easier to diagnose - **changed** — Stream and consumer placement now prefers peers that have caught up with the metalayer, reducing delays in API responses - **changed** — Improved the performance of deleting entries from and encoding AVL sequence sets - **changed** — Fast batch publish now reports backward sequence gaps as well as forward gaps - **changed** — Stream pending message calculations avoid unnecessary filestore cache access and handle deleted sequence ranges more efficiently - **changed** — Stream restore format detection now stops after the first S2 chunk - **changed** — Stream restore waits for the preferred node to become leader, avoiding an incorrect create response during clustered restore - **changed** — Memory backed streams avoid copying message headers and bodies twice when storing messages - **added** — Leafz now reports whether a leafnode connection uses WebSockets - **changed** — QoS2 PUBLISH and PUBREL processing is now pipelined for increased throughput - **changed** — Reduced allocations and buffer copying when processing QoS1 and QoS2 messages and issuing JetStream store and delete requests - **changed** — Partial packets are no longer copied in full on every read, reducing allocations and buffer copying - **fixed** — Connz requests selecting a connection by cid now correctly apply account, user and MQTT client ID filters - **fixed** — Pipelined client operations are no longer processed after a connection is rejected for exceeding the account's max_connections limit - **fixed** — Queue subscription deny permissions are now checked against the mapped delivery subject - **fixed** — Outstanding reply permissions are now preserved when inherited account permissions are refreshed without changing the response policy - **fixed** — Subscription deny filters are now rebuilt atomically when inherited account permissions are refreshed, preventing a window in which denied messages could be delivered - **fixed** — Unquoted configuration values beginning with a number and a size or exponent suffix, such as 0K1abc, are now correctly parsed as strings - **fixed** — Account JWT updates now reject invalid subject mappings instead of reporting success, and failed replacements no longer remove existing mappings - **fixed** — Cached subscription results are now cleared when an already connected client sends another CONNECT, preventing stale results from being reused after an account change - **fixed** — Fixed several data races affecting service imports and exports during configuration reloads and account updates - **fixed** — Per-account routes no longer double count inbound account message and byte statistics - **fixed** — TLS certificate pin validation now checks the correct pins after a configuration reload - **fixed** — Auth callout rejections are now reported as authentication errors instead of account connection limit errors - **fixed** — Scoped ProxyRequired settings are now respected in JWTs and auth callouts - **fixed** — Subscription interest notifications are no longer missed when a subscription is added or removed concurrently - **fixed** — Fast batch ping no longer starts a new batch incorrectly - **fixed** — Fixed issues with auth callout auth_users bypass - **fixed** — Fixed a PDH counter buffer overflow on Windows - **fixed** — Stale per-message TTL entries are now removed when their messages have already been deleted, avoiding repeated expiry scans and excess CPU and memory usage - **fixed** — The maximum deliveries exceeded advisory is now sent correctly when a consumer's max_deliver is lowered below a message's existing delivery count - **fixed** — The consumer created time is now preserved after recovery - **fixed** — Filestore compaction now respects the configured sync settings when replacing a message block - **fixed** — Fixed a race during filestore compaction that could cause consumers to skip messages or lose redelivery tracking - **fixed** — Concurrent updates to R1 consumers no longer lose API responses - **fixed** — Stream and consumer create and delete requests received during metalayer catchup now receive responses once catchup completes - **fixed** — R1 consumer create requests no longer lose their responses when the consumer is deleted immediately afterwards - **fixed** — Fixed a data race when handling consumer leader stepdown requests - **fixed** — Clustered snapshots now use the correct generated names for ephemeral consumers, allowing backup validation and restore to succeed - **fixed** — Fixed a memory leak affecting pull requests and direct gets after a configuration reload when the system account is explicitly configured in the accounts block - **fixed** — Fixed membership change, learner scale-up and metalayer commit recovery issues ##### Changelog Refer to the [2.15 Upgrade Guide](https://docs.nats.io/release-notes/upgrade-to-2.15) for backwards compatibility notes with 2.14.x. ###### Go Version - 1.27.2 (#8740) ###### Dependencies - github.com/klauspost/compress v1.20.1 (#8737) - github.com/nats-io/nats.go v1.53.1 (#8737) ###### Changed JetStream - The `max_ha_assets` limit is now enforced consistently by the metalayer leader during stream and consumer placement, scaling and moves (#8639) Gateways - Support for sending and handling the legacy `$GR.` reply prefix, used by servers prior to v2.1.2, has been removed (#8615) ###### Improved JetStream - Stalled source and mirror flow control is now reported in stream info and warning logs, making missing `$JS.FC.>` imports or exports easier to diagnose (#8633) - Stream and consumer placement now prefers peers that have caught up with the metalayer, reducing delays in API responses (#8643) - Improved the performance of deleting entries from and encoding AVL sequence sets (#8646) - Fast batch publish now reports backward sequence gaps as well as forward gaps (#8699) - Stream pending message calculations avoid unnecessary filestore cache access and handle deleted sequence ranges more efficiently (#8680, #8681) - Stream restore format detection now stops after the first S2 chunk (#8693) - Stream restore waits for the preferred node to become leader, avoiding an incorrect create response during clustered restore (#8690) - Memory backed streams avoid copying message headers and bodies twice when storing messages (#8652, contributed by @randomizedcoder) Monitoring - Leafz now reports whether a leafnode connection uses WebSockets (#8683) MQTT - QoS2 `PUBLISH` and `PUBREL` processing is now pipelined for increased throughput (#8416, contributed by @levb) - Reduced allocations and buffer copying when processing QoS1 and QoS2 messages and issuing JetStream store and delete requests (#8624, #8625, contributed by @levb) - Partial packets are no longer copied in full on every read, reducing allocations and buffer copying (#8692) ###### Fixed General - `Connz` requests selecting a connection by `cid` now correctly apply account, user and MQTT client ID filters (#8613) - Pipelined client operations are no longer processed after a connection is rejected for exceeding the account's `max_connections` limit (#8614) - Queue subscription deny permissions are now checked against the mapped delivery subject (#8616) - Outstanding reply permissions are now preserved when inherited account permissions are refreshed without changing the response policy (#8620, contributed by @0xasritha) - Subscription deny filters are now rebuilt atomically when inherited account permissions are refreshed, preventing a window in which denied messages could be delivered (#8622, contributed by @0xasritha) - Unquoted configuration values beginning with a number and a size or exponent suffix, such as `0K1abc`, are now correctly parsed as strings (#8263, contributed by @koriyoshi2041) - Account JWT updates now reject invalid subject mappings instead of reporting success, and failed replacements no longer remove existing mappings (#8627, contributed by @vulragrag-star) - Cached subscription results are now cleared when an already connected client sends another `CONNECT`, preventing stale results from being reused after an account change (#8641, reported by @Tan-JunWei) - Fixed several data races affecting service imports and exports during configuration reloads and account updates (#8675) - Per-account routes no longer double count inbound account message and byte statistics (#8677) - TLS certificate pin validation now checks the correct pins after a configuration reload (#8679) - Auth callout rejections are now reported as authentication errors instead of account connection limit errors (#8688, contributed by @aniketatgithub) - Scoped `ProxyRequired` settings are now respected _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.1]_ ### v2.14.8 — Release v2.14.8 - Date: 2026-10-09 - Version: v2.14.8 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.8 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.8 - **removed** — Support for sending and handling the legacy $GR. reply prefix, used by servers prior to v2.1.2, has been removed - **changed** — Stalled source and mirror flow control is now reported in stream info and warning logs, making missing $JS.FC.> imports or exports easier to diagnose - **changed** — Stream and consumer placement now prefers peers that have caught up with the metalayer, reducing delays in API responses - **changed** — Improved the performance of deleting entries from and encoding AVL sequence sets - **changed** — Fast batch publish now reports backward sequence gaps as well as forward gaps - **changed** — Stream pending message calculations avoid unnecessary filestore cache access and handle deleted sequence ranges more efficiently - **changed** — Stream restore waits for the preferred node to become leader, avoiding an incorrect create response during clustered restore - **changed** — Memory backed streams avoid copying message headers and bodies twice when storing messages - **added** — Leafz now reports whether a leafnode connection uses WebSockets - **changed** — Partial packets are no longer copied in full on every read, reducing allocations and buffer copying in MQTT - **fixed** — Concurrent account JWT updates no longer invalidate stream imports and interrupt message delivery - **fixed** — Configuration reloads no longer incorrectly disconnect operator mode clients that send an nkey - **fixed** — Connz requests selecting a connection by cid now correctly apply account, user and MQTT client ID filters - **fixed** — Pipelined client operations are no longer processed after a connection is rejected for exceeding the account's max_connections limit - **fixed** — Queue subscription deny permissions are now checked against the mapped delivery subject - **fixed** — Outstanding reply permissions are now preserved when inherited account permissions are refreshed without changing the response policy - **fixed** — Subscription deny filters are now rebuilt atomically when inherited account permissions are refreshed, preventing a window in which denied messages could be delivered - **fixed** — Unquoted configuration values beginning with a number and a size or exponent suffix, such as 0K1abc, are now correctly parsed as strings - **fixed** — Account JWT updates now reject invalid subject mappings instead of reporting success, and failed replacements no longer remove existing mappings - **fixed** — Cached subscription results are now cleared when an already connected client sends another CONNECT, preventing stale results from being reused after an account change - **fixed** — Fixed several data races affecting service imports and exports during configuration reloads and account updates - **fixed** — Per-account routes no longer double count inbound account message and byte statistics - **fixed** — TLS certificate pin validation now checks the correct pins after a configuration reload - **fixed** — Fast batch ping no longer starts a new batch incorrectly - **fixed** — Auth callout rejections are now reported as authentication errors instead of account connection limit errors - **fixed** — Scoped ProxyRequired settings are now respected in JWTs and auth callouts - **fixed** — Subscription interest notifications are no longer missed when a subscription is added or removed concurrently - **fixed** — Fixed a PDH counter buffer overflow on Windows - **fixed** — Stream scale-down requests are now rejected when the target replica count has no configured account tier - **fixed** — Stale per-message TTL entries are now removed when their messages have already been deleted, avoiding repeated expiry scans and excess CPU and memory usage - **fixed** — The maximum deliveries exceeded advisory is now sent correctly when a consumer's max_deliver is lowered below a message's existing delivery count - **fixed** — The consumer created time is now preserved after recovery - **fixed** — Filestore compaction now respects the configured sync settings when replacing a message block - **fixed** — Fixed a race during filestore compaction that could cause consumers to skip messages or lose redelivery tracking - **fixed** — Concurrent updates to R1 consumers no longer lose API responses - **fixed** — Stream and consumer create and delete requests received during metalayer catchup now receive responses once catchup completes - **fixed** — R1 consumer create requests no longer lose their responses when the consumer is deleted immediately afterwards - **fixed** — Fixed a data race when handling consumer leader stepdown requests - **fixed** — Fixed a memory leak affecting pull requests and direct gets after a configuration reload when the system account is explicitly configured in the accounts block - **fixed** — Fixed a panic when shutting down a clustered JetStream server immediately after startup - **fixed** — Idempotent stream create requests with sources no longer time out after leader changes - **fixed** — Recovered ephemeral consumers with inactive_threshold set are now cleaned up properly after a server restart ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.9 (#8740) ###### Dependencies - github.com/klauspost/compress v1.20.1 (#8737) - github.com/nats-io/nats.go v1.53.1 (#8737) ###### Changed Gateways - Support for sending and handling the legacy `$GR.` reply prefix, used by servers prior to v2.1.2, has been removed (#8615) ###### Improved JetStream - Stalled source and mirror flow control is now reported in stream info and warning logs, making missing `$JS.FC.>` imports or exports easier to diagnose (#8633) - Stream and consumer placement now prefers peers that have caught up with the metalayer, reducing delays in API responses (#8643) - Improved the performance of deleting entries from and encoding AVL sequence sets (#8646) - Fast batch publish now reports backward sequence gaps as well as forward gaps (#8699) - Stream pending message calculations avoid unnecessary filestore cache access and handle deleted sequence ranges more efficiently (#8680, #8681) - Stream restore waits for the preferred node to become leader, avoiding an incorrect create response during clustered restore (#8690) - Memory backed streams avoid copying message headers and bodies twice when storing messages (#8652, contributed by @randomizedcoder) Monitoring - Leafz now reports whether a leafnode connection uses WebSockets (#8683) MQTT - Partial packets are no longer copied in full on every read, reducing allocations and buffer copying (#8692) ###### Fixed General - Concurrent account JWT updates no longer invalidate stream imports and interrupt message delivery (#8610) - Configuration reloads no longer incorrectly disconnect operator mode clients that send an `nkey` (#8609) - `Connz` requests selecting a connection by `cid` now correctly apply account, user and MQTT client ID filters (#8613) - Pipelined client operations are no longer processed after a connection is rejected for exceeding the account's `max_connections` limit (#8614) - Queue subscription deny permissions are now checked against the mapped delivery subject (#8616) - Outstanding reply permissions are now preserved when inherited account permissions are refreshed without changing the response policy (#8620, contributed by @0xasritha) - Subscription deny filters are now rebuilt atomically when inherited account permissions are refreshed, preventing a window in which denied messages could be delivered (#8622, contributed by @0xasritha) - Unquoted configuration values beginning with a number and a size or exponent suffix, such as `0K1abc`, are now correctly parsed as strings (#8263, contributed by @koriyoshi2041) - Account JWT updates now reject invalid subject mappings instead of reporting success, and failed replacements no longer remove existing mappings (#8627, contributed by @vulragrag-star) - Cached subscription results are now cleared when an already connected client sends another `CONNECT`, preventing stale results from being reused after an account change (#8641, reported by @Tan-JunWei) - Fixed several data races affecting service imports and exports during configuration reloads and account updates (#8675) - Per-account routes no longer double count inbound account message and byte statistics (#8677) - TLS certificate pin validation now checks the correct pins after a configuration reload (#8679) - Fast batch ping no longer starts a new batch incorrectly (#8714) - Auth callout rejections are now reported as authentication errors instead of account connection limit errors (#8688, contributed by @aniketatgithub) - Scoped `ProxyRequired` settings are now respected in JWTs and auth callouts (#8694) - Subscription interest notifications are no longer missed when a subscription is added or removed concurrently (#8703) - Fixed issues with _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.8]_ ### v2.15.1-RC.2 — Release v2.15.1-RC.2 - Date: 2026-10-06 - Version: v2.15.1-RC.2 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.1-RC.2 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.15.1-rc.2 - Labels: Pre-release - **changed** — Fast batch publish now reports backward sequence gaps as well as forward gaps - **changed** — Stream pending message calculations avoid unnecessary filestore cache access and handle deleted sequence ranges more efficiently - **changed** — Stream restore format detection now stops after the first S2 chunk - **changed** — Stream restore waits for the preferred node to become leader, avoiding an incorrect create response during clustered restore - **changed** — Memory backed streams avoid copying message headers and bodies twice when storing messages - **changed** — Leafz now reports whether a leafnode connection uses WebSockets - **changed** — Partial packets are no longer copied in full on every read, reducing allocations and buffer copying - **fixed** — Fixed several data races affecting service imports and exports during configuration reloads and account updates - **fixed** — Per-account routes no longer double count inbound account message and byte statistics - **fixed** — TLS certificate pin validation now checks the correct pins after a configuration reload - **fixed** — Auth callout rejections are now reported as authentication errors instead of account connection limit errors - **fixed** — Scoped ProxyRequired settings are now respected in JWTs and auth callouts - **fixed** — Subscription interest notifications are no longer missed when a subscription is added or removed concurrently - **fixed** — Fast batch ping no longer starts a new batch incorrectly - **fixed** — TLS state is now available to auth callouts when leafnodes connect over WebSockets - **fixed** — Leafnode clients are now shed alongside regular clients during lame duck shutdown, avoiding a thundering herd - **fixed** — Remote proxies now support TLS with https:// proxy URLs and an optional proxy tls block - **fixed** — Remote proxies no longer incorrectly warn that nats:// URLs are unsupported or lose the hub's initial INFO message - **fixed** — Remote proxy options are now rejected when no proxy URL is specified - **fixed** — Fixed membership change, learner scale-up and metalayer commit recovery issues ##### Changelog Refer to the [2.15 Upgrade Guide](https://docs.nats.io/release-notes/upgrade-to-2.15) for backwards compatibility notes with 2.14.x. ###### Go Version - 1.27.1 ###### Improved JetStream - Fast batch publish now reports backward sequence gaps as well as forward gaps (#8699) - Stream pending message calculations avoid unnecessary filestore cache access and handle deleted sequence ranges more efficiently (#8680, #8681) - Stream restore format detection now stops after the first S2 chunk (#8693) - Stream restore waits for the preferred node to become leader, avoiding an incorrect create response during clustered restore (#8690) - Memory backed streams avoid copying message headers and bodies twice when storing messages (#8652) Monitoring - Leafz now reports whether a leafnode connection uses WebSockets (#8683) MQTT - Partial packets are no longer copied in full on every read, reducing allocations and buffer copying (#8692) ###### Fixed General - Fixed several data races affecting service imports and exports during configuration reloads and account updates (#8675) - Per-account routes no longer double count inbound account message and byte statistics (#8677) - TLS certificate pin validation now checks the correct pins after a configuration reload (#8679) - Auth callout rejections are now reported as authentication errors instead of account connection limit errors (#8688) - Scoped `ProxyRequired` settings are now respected in JWTs and auth callouts (#8694) - Subscription interest notifications are no longer missed when a subscription is added or removed concurrently (#8703) - Fast batch ping no longer starts a new batch incorrectly (#8714) Leafnodes - TLS state is now available to auth callouts when leafnodes connect over WebSockets (#8686) - Leafnode clients are now shed alongside regular clients during lame duck shutdown, avoiding a thundering herd (#8695) - Remote proxies now support TLS with `https://` proxy URLs and an optional proxy `tls` block (#8701) - Remote proxies no longer incorrectly warn that `nats://` URLs are unsupported or lose the hub's initial `INFO` message (#8701) - Remote proxy options are now rejected when no proxy URL is specified (#8701) JetStream - Fixed membership change, learner scale-up and metalayer commit recovery issues (#8672) - Fixed migration and R1 scale-up issues that could delete a running store or lose writes (#8673) - Recreated streams with renamed Raft groups now start their monitors correctly (#8673) - Consumers are no longer moved to new stream peers before those peers hold the stream data (#8678) - Failed clustered stream restores now clean up correctly without deleting a subsequently recreated stream or losing a `stream rm` response (#8702) - Fixed a panic when shutting down a clustered JetStream server immediately after startup (#8707) - Idempotent stream create requests with sources no longer time out after leader changes (#8703) - Interest cleanup no longer compacts a stream past its last sequence during recovery (#8710) MQTT - MQTT packet lengths are validated earlier against `max_payload`, and non-QoS 2 `PUBREC` packets are handled correctly (#8692) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.15.1-RC.1...v2.15.1-RC.2 ### v2.14.8-RC.2 — Release v2.14.8-RC.2 - Date: 2026-10-06 - Version: v2.14.8-RC.2 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.8-RC.2 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.8-rc.2 - Labels: Pre-release - **changed** — Fast batch publish now reports backward sequence gaps as well as forward gaps - **changed** — Stream pending message calculations avoid unnecessary filestore cache access and handle deleted sequence ranges more efficiently - **changed** — Stream restore waits for the preferred node to become leader, avoiding an incorrect create response during clustered restore - **changed** — Memory backed streams avoid copying message headers and bodies twice when storing messages - **changed** — Leafz now reports whether a leafnode connection uses WebSockets - **changed** — Partial packets are no longer copied in full on every read, reducing allocations and buffer copying - **fixed** — Fixed several data races affecting service imports and exports during configuration reloads and account updates - **fixed** — Per-account routes no longer double count inbound account message and byte statistics - **fixed** — TLS certificate pin validation now checks the correct pins after a configuration reload - **fixed** — Fast batch ping no longer starts a new batch incorrectly - **fixed** — Auth callout rejections are now reported as authentication errors instead of account connection limit errors - **fixed** — Scoped ProxyRequired settings are now respected in JWTs and auth callouts - **fixed** — Subscription interest notifications are no longer missed when a subscription is added or removed concurrently - **fixed** — TLS state is now available to auth callouts when leafnodes connect over WebSockets - **fixed** — Leafnode clients are now shed alongside regular clients during lame duck shutdown, avoiding a thundering herd - **fixed** — Remote proxies now support TLS with https:// proxy URLs and an optional proxy tls block - **fixed** — Remote proxies no longer incorrectly warn that nats:// URLs are unsupported or lose the hub's initial INFO message - **fixed** — Remote proxy options are now rejected when no proxy URL is specified - **fixed** — Fixed a panic when shutting down a clustered JetStream server immediately after startup - **fixed** — Idempotent stream create requests with sources no longer time out after leader changes ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.8 ###### Improved JetStream - Fast batch publish now reports backward sequence gaps as well as forward gaps (#8699) - Stream pending message calculations avoid unnecessary filestore cache access and handle deleted sequence ranges more efficiently (#8680, #8681) - Stream restore waits for the preferred node to become leader, avoiding an incorrect create response during clustered restore (#8690) - Memory backed streams avoid copying message headers and bodies twice when storing messages (#8652) Monitoring - Leafz now reports whether a leafnode connection uses WebSockets (#8683) MQTT - Partial packets are no longer copied in full on every read, reducing allocations and buffer copying (#8692) ###### Fixed General - Fixed several data races affecting service imports and exports during configuration reloads and account updates (#8675) - Per-account routes no longer double count inbound account message and byte statistics (#8677) - TLS certificate pin validation now checks the correct pins after a configuration reload (#8679) - Fast batch ping no longer starts a new batch incorrectly (#8714) - Auth callout rejections are now reported as authentication errors instead of account connection limit errors (#8688) - Scoped `ProxyRequired` settings are now respected in JWTs and auth callouts (#8694) - Subscription interest notifications are no longer missed when a subscription is added or removed concurrently (#8703) Leafnodes - TLS state is now available to auth callouts when leafnodes connect over WebSockets (#8686) - Leafnode clients are now shed alongside regular clients during lame duck shutdown, avoiding a thundering herd (#8695) - Remote proxies now support TLS with `https://` proxy URLs and an optional proxy `tls` block (#8701) - Remote proxies no longer incorrectly warn that `nats://` URLs are unsupported or lose the hub's initial `INFO` message (#8701) - Remote proxy options are now rejected when no proxy URL is specified (#8701) JetStream - Fixed a panic when shutting down a clustered JetStream server immediately after startup (#8707) - Idempotent stream create requests with sources no longer time out after leader changes (#8703) MQTT - MQTT packet lengths are validated earlier against `max_payload` (#8692) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.8-RC.1...v2.14.8-RC.2 ### v2.15.1-RC.1 — Release v2.15.1-RC.1 - Date: 2026-09-28 - Version: v2.15.1-RC.1 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.1-RC.1 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.15.1-rc.1 - Labels: Pre-release - **changed** — The max_ha_assets limit is now enforced consistently by the metalayer leader during stream and consumer placement, scaling and moves - **removed** — Support for sending and handling the legacy $GR. reply prefix, used by servers prior to v2.1.2, has been removed - **changed** — Stalled source and mirror flow control is now reported in stream info and warning logs, making missing $JS.FC.> imports or exports easier to diagnose - **changed** — Stream and consumer placement now prefers peers that have caught up with the metalayer, reducing delays in API responses - **changed** — Improved the performance of deleting entries from and encoding AVL sequence sets - **changed** — QOS 2 PUBLISH and PUBREL processing is now pipelined for increased throughput - **changed** — Reduced allocations and buffer copying when processing QOS 1 and QOS 2 messages and issuing JetStream store and delete requests - **fixed** — Connz requests selecting a connection by cid now correctly apply account, user and MQTT client ID filters - **fixed** — Pipelined client operations are no longer processed after a connection is rejected for exceeding the account's max_connections limit - **fixed** — Queue subscription deny permissions are now checked against the mapped delivery subject - **fixed** — Outstanding reply permissions are now preserved when inherited account permissions are refreshed without changing the response policy - **fixed** — Subscription deny filters are now rebuilt atomically when inherited account permissions are refreshed, preventing a window in which denied messages could be delivered - **fixed** — Unquoted configuration values beginning with a number and a size or exponent suffix, such as 0K1abc, are now correctly parsed as strings - **fixed** — Account JWT updates now reject invalid subject mappings instead of reporting success, and failed replacements no longer remove existing mappings - **fixed** — Cached subscription results are now cleared when an already connected client sends another CONNECT, preventing stale results from being reused after an account change - **fixed** — Stale per-message TTL entries are now removed when their messages have already been deleted, avoiding repeated expiry scans and excess CPU and memory usage - **fixed** — The maximum deliveries exceeded advisory is now sent correctly when a consumer's max_deliver is lowered below a message's existing delivery count - **fixed** — The consumer created time is now preserved after recovery - **fixed** — Filestore compaction now respects the configured sync settings when replacing a message block - **fixed** — Fixed a race during filestore compaction that could cause consumers to skip messages or lose redelivery tracking ##### Changelog Refer to the [2.15 Upgrade Guide](https://docs.nats.io/release-notes/upgrade-to-2.15) for backwards compatibility notes with 2.14.x. ###### Go Version - 1.27.1 ###### Changed JetStream - The `max_ha_assets` limit is now enforced consistently by the metalayer leader during stream and consumer placement, scaling and moves (#8639) Gateways - Support for sending and handling the legacy `$GR.` reply prefix, used by servers prior to v2.1.2, has been removed (#8615) ###### Improved JetStream - Stalled source and mirror flow control is now reported in stream info and warning logs, making missing `$JS.FC.>` imports or exports easier to diagnose (#8633) - Stream and consumer placement now prefers peers that have caught up with the metalayer, reducing delays in API responses (#8643) - Improved the performance of deleting entries from and encoding AVL sequence sets (#8646) MQTT - QOS 2 `PUBLISH` and `PUBREL` processing is now pipelined for increased throughput (#8416, contributed by @levb) - Reduced allocations and buffer copying when processing QOS 1 and QOS 2 messages and issuing JetStream store and delete requests (#8624, #8625, contributed by @levb) ###### Fixed General - `Connz` requests selecting a connection by `cid` now correctly apply account, user and MQTT client ID filters (#8613) - Pipelined client operations are no longer processed after a connection is rejected for exceeding the account's `max_connections` limit (#8614) - Queue subscription deny permissions are now checked against the mapped delivery subject (#8616) - Outstanding reply permissions are now preserved when inherited account permissions are refreshed without changing the response policy (#8620, contributed by @0xasritha) - Subscription deny filters are now rebuilt atomically when inherited account permissions are refreshed, preventing a window in which denied messages could be delivered (#8622, contributed by @0xasritha) - Unquoted configuration values beginning with a number and a size or exponent suffix, such as `0K1abc`, are now correctly parsed as strings (#8263, contributed by @koriyoshi2041) - Account JWT updates now reject invalid subject mappings instead of reporting success, and failed replacements no longer remove existing mappings (#8627, contributed by @vulragrag-star) - Cached subscription results are now cleared when an already connected client sends another `CONNECT`, preventing stale results from being reused after an account change (#8641, reported by @Tan-JunWei) JetStream - Stale per-message TTL entries are now removed when their messages have already been deleted, avoiding repeated expiry scans and excess CPU and memory usage (#8595, contributed by @digitalstraw) - The maximum deliveries exceeded advisory is now sent correctly when a consumer's `max_deliver` is lowered below a message's existing delivery count (#8605, contributed by @zeke-lin) - The consumer created time is now preserved after recovery (#8621) - Filestore compaction now respects the configured sync settings when replacing a message block (#8629) - Fixed a race during filestore compaction that could cause consumers to skip messages or lose redelivery tracking (#8623, contributed by @as-clearview) - Concurrent updates to R1 consumers no longer lose API responses (#8628) - Stream and consumer create and delete requests received during metalayer catchup now receive responses once catchup completes (#8643) - R1 consumer create requests no longer lose their responses when the consumer is deleted immediately afterwards (#8643) - Fixed a data race when handling consumer leader stepdown requests (#8647) - Clustered snapshots now use the correct generated names for ephemeral consumers, allowing backup validation and restore to succeed (#8651, contributed by @kris70lesgo) - Fixed a memory leak affecting pull requests and direct gets after a configuration reload when the system account is explicitly _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.1-RC.1]_ ### v2.14.8-RC.1 — Release v2.14.8-RC.1 - Date: 2026-09-28 - Version: v2.14.8-RC.1 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.8-RC.1 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.8-rc.1 - Labels: Pre-release - **removed** — Support for sending and handling the legacy $GR. reply prefix used by servers prior to v2.1.2 has been removed - **changed** — Stalled source and mirror flow control is now reported in stream info and warning logs, making missing $JS.FC.> imports or exports easier to diagnose - **changed** — Stream and consumer placement now prefers peers that have caught up with the metalayer, reducing delays in API responses - **changed** — Improved the performance of deleting entries from and encoding AVL sequence sets - **fixed** — Concurrent account JWT updates no longer invalidate stream imports and interrupt message delivery - **fixed** — Configuration reloads no longer incorrectly disconnect operator mode clients that send an nkey - **fixed** — Connz requests selecting a connection by cid now correctly apply account, user and MQTT client ID filters - **fixed** — Pipelined client operations are no longer processed after a connection is rejected for exceeding the account's max_connections limit - **fixed** — Queue subscription deny permissions are now checked against the mapped delivery subject - **fixed** — Outstanding reply permissions are now preserved when inherited account permissions are refreshed without changing the response policy - **fixed** — Subscription deny filters are now rebuilt atomically when inherited account permissions are refreshed, preventing a window in which denied messages could be delivered - **fixed** — Unquoted configuration values beginning with a number and a size or exponent suffix, such as 0K1abc, are now correctly parsed as strings - **fixed** — Account JWT updates now reject invalid subject mappings instead of reporting success, and failed replacements no longer remove existing mappings - **fixed** — Cached subscription results are now cleared when an already connected client sends another CONNECT, preventing stale results from being reused after an account change - **fixed** — Stream scale-down requests are now rejected when the target replica count has no configured account tier - **fixed** — Stale per-message TTL entries are now removed when their messages have already been deleted, avoiding repeated expiry scans and excess CPU and memory usage - **fixed** — The maximum deliveries exceeded advisory is now sent correctly when a consumer's max_deliver is lowered below a message's existing delivery count - **fixed** — The consumer created time is now preserved after recovery - **fixed** — Filestore compaction now respects the configured sync settings when replacing a message block - **fixed** — Fixed a race during filestore compaction that could cause consumers to skip messages or lose redelivery tracking ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.8 ###### Changed Gateways - Support for sending and handling the legacy `$GR.` reply prefix, used by servers prior to v2.1.2, has been removed (#8615) ###### Improved JetStream - Stalled source and mirror flow control is now reported in stream info and warning logs, making missing `$JS.FC.>` imports or exports easier to diagnose (#8633) - Stream and consumer placement now prefers peers that have caught up with the metalayer, reducing delays in API responses (#8643) - Improved the performance of deleting entries from and encoding AVL sequence sets (#8646) ###### Fixed General - Concurrent account JWT updates no longer invalidate stream imports and interrupt message delivery (#8610) - Configuration reloads no longer incorrectly disconnect operator mode clients that send an `nkey` (#8609) - `Connz` requests selecting a connection by `cid` now correctly apply account, user and MQTT client ID filters (#8613) - Pipelined client operations are no longer processed after a connection is rejected for exceeding the account's `max_connections` limit (#8614) - Queue subscription deny permissions are now checked against the mapped delivery subject (#8616) - Outstanding reply permissions are now preserved when inherited account permissions are refreshed without changing the response policy (#8620, contributed by @0xasritha) - Subscription deny filters are now rebuilt atomically when inherited account permissions are refreshed, preventing a window in which denied messages could be delivered (#8622, contributed by @0xasritha) - Unquoted configuration values beginning with a number and a size or exponent suffix, such as `0K1abc`, are now correctly parsed as strings (#8263, contributed by @koriyoshi2041) - Account JWT updates now reject invalid subject mappings instead of reporting success, and failed replacements no longer remove existing mappings (#8627, contributed by @vulragrag-star) - Cached subscription results are now cleared when an already connected client sends another `CONNECT`, preventing stale results from being reused after an account change (#8641, reported by @Tan-JunWei) JetStream - Stream scale-down requests are now rejected when the target replica count has no configured account tier (#8608) - Stale per-message TTL entries are now removed when their messages have already been deleted, avoiding repeated expiry scans and excess CPU and memory usage (#8595, contributed by @digitalstraw) - The maximum deliveries exceeded advisory is now sent correctly when a consumer's `max_deliver` is lowered below a message's existing delivery count (#8605, contributed by @zeke-lin) - The consumer created time is now preserved after recovery (#8621) - Filestore compaction now respects the configured sync settings when replacing a message block (#8629) - Fixed a race during filestore compaction that could cause consumers to skip messages or lose redelivery tracking (#8623, contributed by @as-clearview) - Concurrent updates to R1 consumers no longer lose API responses (#8628) - Stream and consumer create and delete requests received during metalayer catchup now receive responses once catchup completes (#8643) - R1 consumer create requests no longer lose their responses when the consumer is deleted immediately afterwards (#8643) - Fixed a data race when handling consumer leader stepdown requests (#8647) - Fixed a memory leak affecting pull requests and direct gets after a configuration reload when the system account is explicitly configured in the `accounts` block (#8650, contributed by @1995parham) Leafnodes - Publish permissions are now checked against the transformed subject sent over the leafnode connection, avoiding the need to also allow the origin _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.8-RC.1]_ ### v2.15.0 — Release v2.15.0 - Date: 2026-09-17 - Version: v2.15.0 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.0 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.15.0 - **added** — Desired state metalayer for JetStream streams and consumers to improve safety and reliability of asset moves and scales - **added** — Cancel stream move endpoint to cancel in-flight scale/move operations on a stream using the `$JS.API.STREAM.CANCEL_MOVE` endpoint - **added** — Evacuate endpoints `$JS.API.SERVER.EVACUATE` and `$JS.API.STREAM.PEER.EVACUATE.*` to safely evacuate streams and consumers from a node - **added** — Metalayer rescue endpoint `$JS.API.META.RESCUE` to temporarily lower quorum requirements for metalayer disaster recovery - **added** — Stream backup and restore v2 format for stream snapshots with per-message reads and inclusion of non-replicated consumers on follower nodes - **added** — Detection of source stream recreation to restart sourcing from the beginning when a source stream is recreated - **added** — Stream source indexing to persist last sourced indices for instant lookup instead of expensive backward scans - **added** — Domain-prefixed JS API support in system account for operating on leaf nodes while connected to the hub - **changed** — Streams now have a default limit of 1000 consumers unless `max_consumers` is specified in the stream config or account limits - **changed** — Replicated streams with `sync_interval` set to `always` now sync WAL entries but no longer sync upper stream layer writes - **changed** — The `js_raft_delete_range` feature is now enabled by default - **changed** — The `no_advertise` option no longer includes the hub's own listener address for leafnodes - **changed** — QOS 1 MQTT messages published into JetStream are now pipelined for increased throughput - **changed** — Shorter wait for durable source/mirror consumer resets with heartbeats short-circuiting the recreation backoff - **changed** — Atomic batch for single-replica streams run with `sync: always` now syncs messages as a group - **changed** — JetStream source/mirror reply subjects can now opt-in to be domain/account aware - **fixed** — Leafnode isolation using `request_isolation` or hub-enforced `isolate` now works correctly across cluster nodes ##### Changelog Refer to the [2.15 Upgrade Guide](https://docs.nats.io/release-notes/upgrade-to-2.15) for backwards compatibility notes with 2.14.x. This release also contains all changes up to and including [v2.14.7](https://github.com/nats-io/nats-server/releases/tag/v2.14.7). ###### Go Version - 1.27.1 (#8551) ###### Added JetStream - Desired state metalayer (#8432, #8437, #8439, #8443, #8452, #8460, #8476, #8576, #8598, #8602, #8603) - A new desired state reconciliation engine for streams and consumers considerably improves the safety and reliability of asset moves and scales - Updating the placement or replication factor midway through an existing scale/move operation, cancelling an in-flight scale/move, or peer-removing is now much safer - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md - Cancel stream move endpoint (#8476) - An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new `$JS.API.STREAM.CANCEL_MOVE` endpoint - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md - Evacuate endpoints (#8443) - The new `$JS.API.SERVER.EVACUATE` endpoint can safely evacuate streams, and any consumers on those streams, from a node - The new `$JS.API.STREAM.PEER.EVACUATE.*` endpoint can safely evacuate a peer, and any consumers on that peer, from a stream - These operations combined allow for maintenance operations with full transfer of data and state without having to peer-remove first - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md - Metalayer rescue for disaster recovery (#8408) - The new `$JS.API.META.RESCUE` endpoint can temporarily lower the quorum-needed for the metalayer, in order to facilitate the recovery of a system where nodes have been permanently lost and the metalayer cannot reach quorum - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-61.md - Stream backup and restore v2 (#7882, #8584, #8591, #8604) - A new backup format for stream snapshots which reads out per-message rather than per-block - The new backup format also now correctly includes non-replicated consumers on follower nodes - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-63.md - Detect source stream recreation (#8384) - The server now detects a source stream being recreated, restarting the sourcing back from the beginning, ensuring new messages are sourced - Stream source indexing (#8282, #8516, #8283) - Restarts and leader changes previously required expensive backward scans through the stream to find the last sourced indices. These are now persisted in an index for instant lookup. - Domain-prefixed JS API in system account (#8429) - When a system account is bridged between the hub and a leaf node, the domain-prefixed JS API can now be used to operate on the leaf node while directly connected to the hub ###### Changed JetStream - Streams now have a default limit of 1000 consumers, unless `max_consumers` is specified in the stream config or account limits (#8337, #8566) - Applications planning to use a large number of consumers on a stream should configure `max_consumers` in the stream config or account limits to an appropriately high number - The server-wide default of 1000 can be overridden by setting `default_max_consumers` in the JetStream limits, or can be disabled by setting to `-1` - This limit does not affect existing consumers and will not result in consumer deletions, only the creation of new consumers is prevented - Sync changes for replicated streams (#8447) - When the `sync_interval` is set to `always`, replicated streams now sync their WAL entries but no longer sync upper stream layer writes - The synced log allows the stream to recover safely, but removing unnecessary syncs from the upper stream layer dra _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.0]_ ### v2.15.0-RC.2 — Release v2.15.0-RC.2 - Date: 2026-09-15 - Version: v2.15.0-RC.2 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.0-RC.2 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.15.0-rc.2 - Labels: Pre-release - **added** — Add desired state metalayer for streams and consumers that improves the safety and reliability of asset moves and scales - **added** — Add Cancel stream move endpoint to cancel in-flight scale/move operations and return assets to original placement - **added** — Add SERVER.EVACUATE endpoint to safely evacuate streams and consumers from a node - **added** — Add STREAM.PEER.EVACUATE endpoint to safely evacuate a peer and consumers from a stream - **added** — Add META.RESCUE endpoint to temporarily lower quorum-needed for metalayer recovery when nodes are permanently lost - **added** — Add stream backup and restore v2 with per-message format that correctly includes non-replicated consumers on follower nodes - **added** — Add detection of source stream recreation to restart sourcing from the beginning when a source stream is recreated - **added** — Add stream source indexing to persist last sourced indices for instant lookup instead of expensive backward scans - **added** — Add domain-prefixed JS API support in system account for bridged hub and leaf node operations - **changed** — Streams now have a default limit of 1000 consumers unless max_consumers is specified - **changed** — Replicated streams with sync_interval set to always now sync WAL entries but no longer sync upper stream layer writes - **changed** — Enable js_raft_delete_range feature by default - **changed** — Remove hub's own listener address from no_advertise option for leafnodes - **changed** — Update Go version to 1.27.1 - **fixed** — Fix leafnode isolation using request_isolation or hub-enforced isolate to work correctly across cluster nodes ##### Changelog This release also contains all changes up to and including [v2.14.7](https://github.com/nats-io/nats-server/releases/tag/v2.14.7). ###### Go Version - 1.27.1 (#8551) ###### Added JetStream - Desired state metalayer (#8432, #8437, #8439, #8443, #8452, #8460, #8476, #8576, #8598, #8602) - A new desired state reconciliation engine for streams and consumers considerably improves the safety and reliability of asset moves and scales - Updating the placement or replication factor midway through an existing scale/move operation, cancelling an in-flight scale/move, or peer-removing is now much safer - Cancel stream move endpoint (#8476) - An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new `$JS.API.STREAM.CANCEL_MOVE` endpoint - Evacuate endpoints (#8443) - The new `$JS.API.SERVER.EVACUATE` endpoint can safely evacuate streams, and any consumers on those streams, from a node - The new `$JS.API.STREAM.PEER.EVACUATE.*` endpoint can safely evacuate a peer, and any consumers on that peer, from a stream - These operations combined allow for maintenance operations with full transfer of data and state without having to peer-remove first - Metalayer rescue for disaster recovery (#8408) - The new `$JS.API.META.RESCUE` endpoint can temporarily lower the quorum-needed for the metalayer, in order to facilitate the recovery of a system where nodes have been permanently lost and the metalayer cannot reach quorum - Stream backup and restore v2 (#7882, #8584, #8591) - A new backup format for stream snapshots which reads out per-message rather than per-block - The new backup format also now correctly includes non-replicated consumers on follower nodes - Detect source stream recreation (#8384) - The server now detects a source stream being recreated, restarting the sourcing back from the beginning, ensuring new messages are sourced - Stream source indexing (#8282, #8516, #8283) - Restarts and leader changes previously required expensive backward scans through the stream to find the last sourced indices. These are now persisted in an index for instant lookup. - Domain-prefixed JS API in system account (#8429) - When a system account is bridged between the hub and a leaf node, the domain-prefixed JS API can now be used to operate on the leaf node while directly connected to the hub ###### Changed JetStream - Streams now have a default limit of 1000 consumers, unless `max_consumers` is specified in the stream config or account limits (#8337, #8566) - Applications planning to use a large number of consumers on a stream should configure `max_consumers` in the stream config or account limits to an appropriately high number - The server-wide default of 1000 can be overridden by setting `default_max_consumers` in the JetStream limits, or can be disabled by setting to `-1` - This limit does not affect existing consumers and will not result in consumer deletions, only the creation of new consumers is prevented - Sync changes for replicated streams (#8447) - When the `sync_interval` is set to `always`, replicated streams now sync their WAL entries but no longer sync upper stream layer writes - The synced log allows the stream to recover safely, but removing unnecessary syncs from the upper stream layer dramatically improves performance - Non-replicated R1 streams are not affected by this change and will continue to sync at the stream layer as normal - The `js_raft_delete_range` feature is now enabled by default (#8520) Leafnodes - The `no_advertise` option no longer includes the hub's own listener address (#8451) ###### Improved JetStream - Shorter wait for durable source/mirror consumer resets (#8323) - When using durable consumers for sourcing or mirroring, the heartbeats now short-circuit the recreation backoff ###### Fixed Leafnodes - Leafnode isolation usi _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.0-RC.2]_ ### v2.14.7 — Release v2.14.7 - Date: 2026-09-15 - Version: v2.14.7 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.7 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.7 - **added** — Add compatibility for the new desired state metalayer, introduced in v2.15, to support safe upgrades and downgrades - **changed** — Replace the `fastrand` and `math/rand` packages with `math/rand/v2` - **changed** — Reduce lock contention that could arise from tracking event IDs or closed connections - **changed** — Aggregate block removals when syncing deletes from a snapshot, reducing pending calculations - **changed** — Perform message size checks before more expensive header checks - **changed** — Improve pending calculations speed when the max messages per subject limit is 1 - **fixed** — Fix the `{{left}}` and `{{right}}` mapping functions to work correctly in account mappings and source/mirror transforms - **fixed** — Fix a potential underflow when calculating deletes in skip messages - **fixed** — Fix an issue where catchup signals to the metalayer are blocked, which could stall stream or cluster management operations until the node is restarted - **fixed** — Fix consumer removal handling after a recreate during metalayer recovery at startup - **fixed** — Fix a potential panic that could happen when filestore block caches were released during message removal - **fixed** — Restore the last dedupe message ID correctly if the last message was outside of the window after restart - **fixed** — Remove an unreachable send snapshot condition from the stream monitor - **fixed** — Count pull request expiry as activity when `inactive_threshold` is set - **fixed** — Prevent purges and roll-ups on multi-filter subject consumers from advancing past unrelated subjects - **fixed** — Extend filestore compression header checking to check for compatible compression values and for the presence of correct or incorrect first record checksums, avoiding collisions at the beginning of a message block - **fixed** — Remove JetStream usage from peer-removed nodes from the remaining cluster node accounting correctly - **fixed** — Fix a data race between deduplication tracking and stream config updates - **fixed** — Fix a potential nil consumer info when responding to consumer reset requests - **fixed** — Prevent stream catchups from running for removed or re-synced peers ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.8 (#8551) ###### Dependencies - github.com/antithesishq/antithesis-sdk-go v0.8.0-default-no-op (#8562) - github.com/klauspost/compress v1.20.0 (#8562) - golang.org/x/crypto v0.57.0 (#8597) - golang.org/x/sys v0.48.0 (#8597) - golang.org/x/time v0.16.0 (#8597) ###### Added JetStream - Compatibility for the new desired state metalayer, introduced in v2.15, to support safe upgrades and downgrades (#8554) ###### Improved General - The `fastrand` and `math/rand` packages have been replaced with `math/rand/v2` (#8538, #8557) - Reduced lock contention that could arise from tracking event IDs or closed connections (#8533) JetStream - When syncing deletes from a snapshot, block removals are now aggregated, reducing pending calculations (#8545) - Message size checks are now performed before more expensive header checks (#8561) - Pending calculations are now considerably faster when the max messages per subject limit is 1 (#8567) ###### Fixed General - The `{{left}}` and `{{right}}` mapping functions now work correctly in account mappings and source/mirror transforms (#8568) JetStream - A potential underflow when calculating deletes in skip messages has been fixed (#8546) - Fixed an issue where catchup signals to the metalayer are blocked, which could stall stream or cluster management operations until the node is restarted (#8555) - Consumer removal is now handled correctly after a recreate during metalayer recovery at startup (#8556) - Fixed a potential panic that could happen when filestore block caches were released during message removal (#8548) - The last dedupe message ID is now restored correctly if the last message was outside of the window after restart (#8564) - An unreachable send snapshot condition has been removed from the stream monitor (#8565) - Pull request expiry is now counted as activity when `inactive_threshold` is set (#8575) - Purges and roll-ups on multi-filter subject consumers will no longer advance past unrelated subjects (#8572) - Filestore compression header checking is now extended to check for compatible compression values and for the presence of correct or incorrect first record checksums, avoiding collisions at the beginning of a message block (#8581) - JetStream usage from peer-removed nodes is now removed from the remaining cluster node accounting correctly (#8570) - Fixed a data race between deduplication tracking and stream config updates (#8598) - Fixed a potential nil consumer info when responding to consumer reset requests (#8598) - Stream catchups will no longer run for removed or re-synced peers (#8598) - Fixed a race condition that could leave ghost consumer assignments when deleting consumers (#8598) - Pausing a consumer with pending changes no longer cancels out the in-flight assignment (#8598) - Stepping down a consumer leader with pending changes no longer fails (#8598) - Switching a stream to interest retention policy with no consumers now correctly cleans up messages with no interest (#8598) - Fixed an issue where removed consumers were incorrectly matched without checking the group name (#8598) - A number of stream and consumer endpoints will no longer report the wrong state based on in-flight proposals (#8598) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.6...v2.14.7 ### v2.14.7-RC.2 — Release v2.14.7-RC.2 - Date: 2026-09-14 - Version: v2.14.7-RC.2 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.7-RC.2 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.7-rc.2 - Labels: Pre-release - **fixed** — Fixed a data race between deduplication tracking and stream config updates - **fixed** — Fixed a potential nil consumer info when responding to consumer reset requests - **fixed** — Stream catchups will no longer run for removed or re-synced peers - **fixed** — Fixed a race condition that could leave ghost consumer assignments when deleting consumers - **fixed** — Pausing a consumer with pending changes no longer cancels out the in-flight assignment - **fixed** — Stepping down a consumer leader with pending changes no longer fails - **fixed** — Switching a stream to interest retention policy with no consumers now correctly cleans up messages with no interest - **fixed** — Fixed an issue where removed consumers were incorrectly matched without checking the group name - **fixed** — A number of stream and consumer endpoints will no longer report the wrong state based on in-flight proposals - **changed** — Updated golang.org/x/crypto to v0.57.0 - **changed** — Updated golang.org/x/sys to v0.48.0 - **changed** — Updated golang.org/x/time to v0.16.0 ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.8 ###### Dependencies - golang.org/x/crypto v0.57.0 (#8597) - golang.org/x/sys v0.48.0 (#8597) - golang.org/x/time v0.16.0 (#8597) ###### Fixed JetStream - Fixed a data race between deduplication tracking and stream config updates (#8598) - Fixed a potential nil consumer info when responding to consumer reset requests (#8598) - Stream catchups will no longer run for removed or re-synced peers (#8598) - Fixed a race condition that could leave ghost consumer assignments when deleting consumers (#8598) - Pausing a consumer with pending changes no longer cancels out the in-flight assignment (#8598) - Stepping down a consumer leader with pending changes no longer fails (#8598) - Switching a stream to interest retention policy with no consumers now correctly cleans up messages with no interest (#8598) - Fixed an issue where removed consumers were incorrectly matched without checking the group name (#8598) - A number of stream and consumer endpoints will no longer report the wrong state based on in-flight proposals (#8598) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.7-RC.1...v2.14.7-RC.2 ### v2.14.7-RC.1 — Release v2.14.7-RC.1 - Date: 2026-09-10 - Version: v2.14.7-RC.1 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.7-RC.1 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.7-rc.1 - Labels: Pre-release - **added** — Compatibility for the new desired state metalayer, introduced in v2.15, to support safe upgrades and downgrades - **changed** — The fastrand and math/rand packages have been replaced with math/rand/v2 - **changed** — Reduced lock contention that could arise from tracking event IDs or closed connections - **changed** — When syncing deletes from a snapshot, block removals are now aggregated, reducing pending calculations - **changed** — Message size checks are now performed before more expensive header checks - **changed** — Pending calculations are now considerably faster when the max messages per subject limit is 1 - **fixed** — The {{left}} and {{right}} mapping functions now work correctly in account mappings and source/mirror transforms - **fixed** — A potential underflow when calculating deletes in skip messages has been fixed - **fixed** — Fixed an issue where catchup signals to the metalayer are blocked, which could stall stream or cluster management operations until the node is restarted - **fixed** — Consumer removal is now handled correctly after a recreate during metalayer recovery at startup - **fixed** — Fixed a potential panic that could happen when filestore block caches were released during message removal - **fixed** — The last dedupe message ID is now restored correctly if the last message was outside of the window after restart - **fixed** — An unreachable send snapshot condition has been removed from the stream monitor - **fixed** — Pull request expiry is now counted as activity when inactive_threshold is set - **fixed** — Purges and roll-ups on multi-filter subject consumers will no longer advance past unrelated subjects - **fixed** — Filestore compression header checking is now extended to check for compatible compression values and for the presence of correct or incorrect first record checksums, avoiding collisions at the beginning of a message block - **fixed** — JetStream usage from peer-removed nodes is now removed from the remaining cluster node accounting correctly ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.8 (#8551) ###### Dependencies - github.com/antithesishq/antithesis-sdk-go v0.8.0-default-no-op (#8562) - github.com/klauspost/compress v1.20.0 (#8562) - golang.org/x/crypto v0.56.0 (#8562) ###### Added JetStream - Compatibility for the new desired state metalayer, introduced in v2.15, to support safe upgrades and downgrades (#8554) ###### Improved General - The `fastrand` and `math/rand` packages have been replaced with `math/rand/v2` (#8538, #8557) - Reduced lock contention that could arise from tracking event IDs or closed connections (#8533) JetStream - When syncing deletes from a snapshot, block removals are now aggregated, reducing pending calculations (#8545) - Message size checks are now performed before more expensive header checks (#8561) - Pending calculations are now considerably faster when the max messages per subject limit is 1 (#8567) ###### Fixed General - The `{{left}}` and `{{right}}` mapping functions now work correctly in account mappings and source/mirror transforms (#8568) JetStream - A potential underflow when calculating deletes in skip messages has been fixed (#8546) - Fixed an issue where catchup signals to the metalayer are blocked, which could stall stream or cluster management operations until the node is restarted (#8555) - Consumer removal is now handled correctly after a recreate during metalayer recovery at startup (#8556) - Fixed a potential panic that could happen when filestore block caches were released during message removal (#8548) - The last dedupe message ID is now restored correctly if the last message was outside of the window after restart (#8564) - An unreachable send snapshot condition has been removed from the stream monitor (#8565) - Pull request expiry is now counted as activity when `inactive_threshold` is set (#8575) - Purges and roll-ups on multi-filter subject consumers will no longer advance past unrelated subjects (#8572) - Filestore compression header checking is now extended to check for compatible compression values and for the presence of correct or incorrect first record checksums, avoiding collisions at the beginning of a message block (#8581) - JetStream usage from peer-removed nodes is now removed from the remaining cluster node accounting correctly (#8570) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.6...v2.14.7-RC.1 ### v2.15.0-RC.1 — Release v2.15.0-RC.1 - Date: 2026-09-07 - Version: v2.15.0-RC.1 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.0-RC.1 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.15.0-rc.1 - Labels: Pre-release - **added** — Add desired state metalayer for JetStream streams and consumers to improve safety and reliability of asset moves and scales - **added** — Add cancel stream move endpoint $JS.API.STREAM.CANCEL_MOVE to cancel in-flight scale/move operations - **added** — Add evacuate endpoints $JS.API.SERVER.EVACUATE and $JS.API.STREAM.PEER.EVACUATE.* to safely evacuate streams and consumers from nodes - **added** — Add metalayer rescue endpoint $JS.API.META.RESCUE for disaster recovery to temporarily lower quorum requirements - **added** — Add stream backup and restore v2 with new backup format that reads per-message rather than per-block and includes non-replicated consumers - **added** — Add detection of source stream recreation to restart sourcing from the beginning - **added** — Add stream source indexing to persist sourced indices for instant lookup instead of expensive backward scans - **added** — Add domain-prefixed JS API support in system account for bridged leaf nodes - **changed** — Set default limit of 1000 consumers per stream unless max_consumers is specified in stream config or account limits - **changed** — Change sync behavior for replicated streams with sync_interval set to always to sync WAL entries but no longer sync upper stream layer writes - **changed** — Enable js_raft_delete_range feature by default - **changed** — Update no_advertise option for leafnodes to no longer include the hub's own listener address - **fixed** — Fix leafnode isolation using request_isolation or hub-enforced isolate to work correctly across cluster nodes ##### Changelog This release also contains all changes up to and including [v2.14.6](https://github.com/nats-io/nats-server/releases/tag/v2.14.6). ###### Go Version - 1.27.1 (#8551) ###### Added JetStream - Desired state metalayer (#8432, #8437, #8439, #8443, #8452, #8460, #8476, #8576) - A new desired state reconciliation engine for streams and consumers considerably improves the safety and reliability of asset moves and scales - Updating the placement or replication factor midway through an existing scale/move operation, cancelling an in-flight scale/move, or peer-removing is now much safer - Cancel stream move endpoint (#8476) - An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new `$JS.API.STREAM.CANCEL_MOVE` endpoint - Evacuate endpoints (#8443) - The new `$JS.API.SERVER.EVACUATE` endpoint can safely evacuate streams, and any consumers on those streams, from a node - The new `$JS.API.STREAM.PEER.EVACUATE.*` endpoint can safely evacuate a peer, and any consumers on that peer, from a stream - These operations combined allow for maintenance operations with full transfer of data and state without having to peer-remove first - Metalayer rescue for disaster recovery (#8408) - The new `$JS.API.META.RESCUE` endpoint can temporarily lower the quorum-needed for the metalayer, in order to facilitate the recovery of a system where nodes have been permanently lost and the metalayer cannot reach quorum - Stream backup and restore v2 (#7882) - A new backup format for stream snapshots which reads out per-message rather than per-block - The new backup format also now correctly includes non-replicated consumers on follower nodes - Detect source stream recreation (#8384) - The server now detects a source stream being recreated, restarting the sourcing back from the beginning, ensuring new messages are sourced - Stream source indexing (#8282, #8516, #8283) - Restarts and leader changes previously required expensive backward scans through the stream to find the last sourced indices. These are now persisted in an index for instant lookup. - Domain-prefixed JS API in system account (#8429) - When a system account is bridged between the hub and a leaf node, the domain-prefixed JS API can now be used to operate on the leaf node while directly connected to the hub ###### Changed JetStream - Streams now have a default limit of 1000 consumers, unless `max_consumers` is specified in the stream config or account limits (#8337, #8566) - Applications planning to use a large number of consumers on a stream should configure `max_consumers` in the stream config or account limits to an appropriately high number - The server-wide default of 1000 can be overridden by setting `default_max_consumers` in the JetStream limits, or can be disabled by setting to `-1` - This limit does not affect existing consumers and will not result in consumer deletions, only the creation of new consumers is prevented - Sync changes for replicated streams (#8447) - When the `sync_interval` is set to `always`, replicated streams now sync their WAL entries but no longer sync upper stream layer writes - The synced log allows the stream to recover safely, but removing unnecessary syncs from the upper stream layer dramatically improves performance - Non-replicated R1 streams are not affected by this change and will continue to sync at the stream layer as normal - The `js_raft_delete_range` feature is now enabled by default (#8520) Leafnodes - The `no_advertise` option no longer includes the hub's own listener address (#8451) ###### Improved JetStream - Shorter wait for durable source/mirror consumer resets (#8323) - When using durable consumers for sourcing or mirroring, the heartbeats now short-circuit the recreation backoff ###### Fixed Leafnodes - Leafnode isolation using `request_isolation`, or w _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.0-RC.1]_ ### v2.14.6 — Release v2.14.6 - Date: 2026-08-27 - Version: v2.14.6 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.6 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.6 - **changed** — Removal from service import response maps is now constant-time - **changed** — The client code no longer resets the deadline more times than necessary when flushing client buffers - **changed** — The client write buffers are now freed correctly when the working buffer exceeds a rational size - **changed** — Stream reads are now isolated with a separate lock, which improves the performance of direct gets - **changed** — Improved the performance of looking up matching sequence numbers for multi-subject gets - **changed** — Reduced the number of heap escapes in subject tree matching - **fixed** — WebSocket client buffers are recycled more aggressively when reallocating into larger buffers - **fixed** — Fixed missing routes after a reconnect when gossiped URLs were rejected - **fixed** — The filestore block sync no longer incorrectly skips blocks that were compacted during the same pass - **fixed** — The filestore block sync now performs a single directory sync upon completion rather than once per compacted block - **fixed** — The filestore I/O semaphore now covers block sync operations - **fixed** — Stream config updates with replicas greater than 1 are now rejected on non-clustered systems - **fixed** — Fixed some issues that could prevent stream snapshots from taking place on a clean shutdown - **fixed** — The filestore inline compaction no longer ignores sync_interval: always - **fixed** — The stream created time is now preserved after recovery on a standalone server - **fixed** — Fixed a data race that could apply when accessing the batch ID - **fixed** — Fixed a data race when reading the consumer direct or sourcing status - **fixed** — Prevent the consumer direct or sourcing status from being changed with a consumer update - **fixed** — Fixed an issue where the server could fail to distinguish consumer tiers when enforcing limits - **fixed** — Fixed a flow control problem where replicated consumers could get stuck after a leader change ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.7 ###### Improved General - Removal from service import response maps is now constant-time (#8463) - The client code no longer resets the deadline more times than necessary when flushing client buffers (#8513) - The client write buffers are now freed correctly when the working buffer exceeds a rational size (#8515) JetStream - Stream reads are now isolated with a separate lock, which improves the performance of direct gets (#8486) - Improved the performance of looking up matching sequence numbers for multi-subject gets (#8486) - Reduced the number of heap escapes in subject tree matching (#8526) ###### Fixed General - WebSocket client buffers are recycled more aggressively when reallocating into larger buffers (#8518) - Fixed missing routes after a reconnect when gossiped URLs were rejected (#8527) JetStream - The filestore block sync no longer incorrectly skips blocks that were compacted during the same pass (#8456) - The filestore block sync now performs a single directory sync upon completion rather than once per compacted block (#8461) - The filestore I/O semaphore now covers block sync operations (#8462) - Stream config updates with replicas greater than 1 are now rejected on non-clustered systems (#8464) - Fixed some issues that could prevent stream snapshots from taking place on a clean shutdown (#8465) - The filestore inline compaction no longer ignores `sync_interval: always` (#8475) - The stream created time is now preserved after recovery on a standalone server (#8471, contributed by @Green7) - Fixed a data race that could apply when accessing the batch ID (#8369) - Fixed a data race when reading the consumer direct or sourcing status (#8478, contributed by @nberlee) - Prevent the consumer direct or sourcing status from being changed with a consumer update (#8478, contributed by @nberlee) - Fixed an issue where the server could fail to distinguish consumer tiers when enforcing limits (#8484) - Fixed a flow control problem where replicated consumers could get stuck after a leader change (#8488) - Fixed various consumer create issues that could destroy the state of an existing consumer with the same name (#8491) - Internal message delete proposals are no longer counted in the JS API statistics (#8502) - Dynamic filestore reservations no longer incorrectly shrink based on used storage after restarts (#8503) - Fixed a signalling issue that could stall Raft catchups (#8501) - The pending append entry cache in-memory is now bounded by size as well as entry count (#8501) - Fixed an issue where a stale snapshot from a previous Raft group could be replayed if the group name was unchanged (#8501) - Consumer delivery counts will no longer underflow below zero (#8512, contributed by @no-hup) - `AckFlowControl` consumers from a work queue stream will no longer incorrectly ack messages outside of the consumer filter (#8431, #8528) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.5...v2.14.6 ### v2.14.6-RC.2 — Release v2.14.6-RC.2 - Date: 2026-08-26 - Version: v2.14.6-RC.2 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.6-RC.2 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.6-rc.2 - Labels: Pre-release - **changed** — Reduced the number of heap escapes in subject tree matching - **fixed** — Fixed a signalling issue that could stall Raft catchups - **fixed** — The pending append entry cache in-memory is now bounded by size as well as entry count - **fixed** — Fixed an issue where a stale snapshot from a previous Raft group could be replayed if the group name was unchanged - **fixed** — Consumer delivery counts will no longer underflow below zero ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.7 ###### Improved JetStream - Reduced the number of heap escapes in subject tree matching (#8526) ###### Fixed JetStream - Fixed a signalling issue that could stall Raft catchups (#8501) - The pending append entry cache in-memory is now bounded by size as well as entry count (#8501) - Fixed an issue where a stale snapshot from a previous Raft group could be replayed if the group name was unchanged (#8501) - Consumer delivery counts will no longer underflow below zero (#8512, contributed by @no-hup) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.6-RC.1...v2.14.6-RC.2 ### v2.14.6-RC.1 — Release v2.14.6-RC.1 - Date: 2026-08-25 - Version: v2.14.6-RC.1 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.6-RC.1 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.6-rc.1 - Labels: Pre-release - **changed** — Removal from service import response maps is now constant-time - **changed** — The client code no longer resets the deadline more times than necessary when flushing client buffers - **changed** — The client write buffers are now freed correctly when the working buffer exceeds a rational size - **changed** — Stream reads are now isolated with a separate lock, which improves the performance of direct gets - **changed** — Improved the performance of looking up matching sequence numbers for multi-subject gets - **fixed** — WebSocket client buffers are recycled more aggressively when reallocating into larger buffers - **fixed** — The filestore block sync no longer incorrectly skips blocks that were compacted during the same pass - **fixed** — The filestore block sync now performs a single directory sync upon completion rather than once per compacted block - **fixed** — The filestore I/O semaphore now covers block sync operations - **fixed** — Stream config updates with replicas greater than 1 are now rejected on non-clustered systems - **fixed** — Fixed some issues that could prevent stream snapshots from taking place on a clean shutdown - **fixed** — The filestore inline compaction no longer ignores sync_interval: always - **fixed** — The stream created time is now preserved after recovery on a standalone server - **fixed** — Fixed a data race that could apply when accessing the batch ID - **fixed** — Fixed a data race when reading the consumer direct or sourcing status - **fixed** — Prevent the consumer direct or sourcing status from being changed with a consumer update - **fixed** — Fixed an issue where the server could fail to distinguish consumer tiers when enforcing limits - **fixed** — Fixed a flow control problem where replicated consumers could get stuck after a leader change - **fixed** — Fixed various consumer create issues that could destroy the state of an existing consumer with the same name - **fixed** — Internal message delete proposals are no longer counted in the JS API statistics ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.7 ###### Improved General - Removal from service import response maps is now constant-time (#8463) - The client code no longer resets the deadline more times than necessary when flushing client buffers (#8513) - The client write buffers are now freed correctly when the working buffer exceeds a rational size (#8515) JetStream - Stream reads are now isolated with a separate lock, which improves the performance of direct gets (#8486) - Improved the performance of looking up matching sequence numbers for multi-subject gets (#8486) ###### Fixed General - WebSocket client buffers are recycled more aggressively when reallocating into larger buffers (#8518) JetStream - The filestore block sync no longer incorrectly skips blocks that were compacted during the same pass (#8456) - The filestore block sync now performs a single directory sync upon completion rather than once per compacted block (#8461) - The filestore I/O semaphore now covers block sync operations (#8462) - Stream config updates with replicas greater than 1 are now rejected on non-clustered systems (#8464) - Fixed some issues that could prevent stream snapshots from taking place on a clean shutdown (#8465) - The filestore inline compaction no longer ignores `sync_interval: always` (#8475) - The stream created time is now preserved after recovery on a standalone server (#8471, contributed by @Green7) - Fixed a data race that could apply when accessing the batch ID (#8369) - Fixed a data race when reading the consumer direct or sourcing status (#8478, contributed by @nberlee) - Prevent the consumer direct or sourcing status from being changed with a consumer update (#8478, contributed by @nberlee) - Fixed an issue where the server could fail to distinguish consumer tiers when enforcing limits (#8484) - Fixed a flow control problem where replicated consumers could get stuck after a leader change (#8488) - Fixed various consumer create issues that could destroy the state of an existing consumer with the same name (#8491) - Internal message delete proposals are no longer counted in the JS API statistics (#8502) - Dynamic filestore reservations no longer incorrectly shrink based on used storage after restarts (#8503) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.5...v2.14.6-RC.1 ### v2.15.0-preview.1 — Release v2.15.0-preview.1 - Date: 2026-08-24 - Version: v2.15.0-preview.1 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.15.0-preview.1 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.15.0-preview.1 - Labels: Pre-release - **added** — Add desired state metalayer for JetStream streams and consumers to improve safety and reliability of asset moves and scales - **added** — Add cancel stream move endpoint to cancel in-flight scale/move operations on a stream - **added** — Add evacuate endpoints to safely evacuate streams and consumers from a node - **added** — Add metalayer rescue endpoint for disaster recovery to temporarily lower quorum requirements - **added** — Add stream backup and restore v2 format that reads per-message and correctly includes non-replicated consumers on follower nodes - **added** — Add detection of source stream recreation to restart sourcing from the beginning - **added** — Add stream source indexing to persist last sourced indices for instant lookup instead of expensive backward scans - **added** — Add domain-prefixed JS API support in system account for operating on leaf nodes from hub - **changed** — Change replicated streams with sync_interval set to always to sync WAL entries but no longer sync upper stream layer writes - **changed** — Improve durable source and mirror consumer resets with shorter wait through heartbeat short-circuiting of recreation backoff ##### Changelog > [!IMPORTANT] > This is a preview release for the upcoming 2.15 series. This is not a formal release candidate and is still undergoing testing, but we would welcome feedback. This release also contains all changes up to and including [v2.14.5](https://github.com/nats-io/nats-server/releases/tag/v2.14.5). ###### Go Version - 1.27.0 ###### Added JetStream - Desired state metalayer (#8432, #8437, #8439, #8443, #8452, #8460, #8476) - A new desired state reconciliation engine for streams and consumers considerably improves the safety and reliability of asset moves and scales - Updating the placement or replication factor midway through an existing scale/move operation, cancelling an in-flight scale/move, or peer-removing is now much safer - Cancel stream move endpoint (#8476) - An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new `$JS.API.STREAM.CANCEL_MOVE` endpoint - Evacuate endpoints (#8443) - The new `$JS.API.SERVER.EVACUATE` endpoint can safely evacuate streams, and any consumers on those streams, from a node - The new `$JS.API.STREAM.PEER.EVACUATE.*` endpoint can safely evacuate a peer, and any consumers on that peer, from a stream - These operations combined allow for maintenance operations with full transfer of data and state without having to peer-remove first - Metalayer rescue for disaster recovery (#8408) - The new `$JS.API.META.RESCUE` endpoint can temporarily lower the quorum-needed for the metalayer, in order to facilitate the recovery of a system where nodes have been permanently lost and the metalayer cannot reach quorum - Stream backup and restore v2 (#7882) - A new backup format for stream snapshots which reads out per-message rather than per-block - The new backup format also now correctly includes non-replicated consumers on follower nodes - Detect source stream recreation (#8384) - The server now detects a source stream being recreated, restarting the sourcing back from the beginning, ensuring new messages are sourced - Stream source indexing (#8282) - Restarts and leader changes previously required expensive backward scans through the stream to find the last sourced indices. These are now persisted in an index for instant lookup. - Domain-prefixed JS API in system account (#8429) - When a system account is bridged between the hub and a leaf node, the domain-prefixed JS API can now be used to operate on the leaf node while directly connected to the hub ###### Changed JetStream - Sync changes for replicated streams (#8447) - When the `sync_interval` is set to `always`, replicated streams now sync their WAL entries but no longer sync upper stream layer writes - The synced log allows the stream to recover safely, but removing unnecessary syncs from the upper stream layer dramatically improves performance - Non-replicated R1 streams are not affected by this change and will continue to sync at the stream layer as normal ###### Improved JetStream - Shorter wait for durable source/mirror consumer resets (#8323) - When using durable consumers for sourcing or mirroring, the heartbeats now short-circuit the recreation backoff ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.5...v2.15.0-preview.1 ### v2.14.5 — Release v2.14.5 - Date: 2026-08-12 - Version: v2.14.5 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.5 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.5 - **added** — New dial_timeout option can be specified in the leafnode config block or for specific remotes in the configuration, allowing it to be increased above the default 1 second for high-latency links - **fixed** — Fixed a deadlock that could occur in the logger when a close error occurs - **fixed** — Fixed a bug that could result in potential data loss when handling idempotent stream creates when an offline node catches up from a metalayer snapshot, caused by an incorrect update to the create time in the stream assignment ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.5 ###### Dependencies - github.com/klauspost/compress v1.19.2 (#8459) - golang.org/x/crypto v0.55.0 (#8459) ###### Added Leafnodes - New `dial_timeout` option can be specified in the `leafnode` config block or for specific remotes in the configuration, allowing it to be increased above the default 1 second for high-latency links (#8427) ###### Fixed General - Fixed a deadlock that could occur in the logger when a close error occurs (#8430) JetStream - Fix a bug that could result in potential data loss when handling idempotent stream creates when an offline node catches up from a metalayer snapshot, caused by an incorrect update to the create time in the stream assignment (#8449) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.4...v2.14.5 ### v2.12.15 — Release v2.12.15 - Date: 2026-08-12 - Version: v2.12.15 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.12.15 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.12.15 - **fixed** — Fixed a deadlock that could occur in the logger when a close error occurs - **fixed** — Fix a bug that could result in potential data loss when handling idempotent stream creates when an offline node catches up from a metalayer snapshot, caused by an incorrect update to the create time in the stream assignment ##### Changelog ###### Go Version - 1.25.12 ###### Dependencies - github.com/klauspost/compress v1.19.2 (#8459) - golang.org/x/crypto v0.55.0 (#8459) ###### Fixed General - Fixed a deadlock that could occur in the logger when a close error occurs (#8430) JetStream - Fix a bug that could result in potential data loss when handling idempotent stream creates when an offline node catches up from a metalayer snapshot, caused by an incorrect update to the create time in the stream assignment (#8449) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.12.14...v2.12.15 ### v2.14.4 — Release v2.14.4 - Date: 2026-07-30 - Version: v2.14.4 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.4 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.4 - **changed** — Go version updated to 1.26.5 - **changed** — github.com/klauspost/compress updated to v1.19.0 - **changed** — golang.org/x/crypto updated to v0.54.0 - **changed** — golang.org/x/sys updated to v0.47.0 - **changed** — github.com/antithesishq/antithesis-sdk-go updated to v0.7.2-default-no-op - **changed** — Raft transport layer has been decoupled to improve testing - **changed** — Disk concurrency semaphore increased to 4096 slots from the previous CPU-scaled count - **added** — Disk concurrency semaphore can now be configured with the max_concurrent_io option in the jetstream config block - **changed** — Filestore underlying block cache buffers are now recycled to the pool when the weak reference is collected by the GC - **changed** — Calculating and looking up sequences in delete maps for file-backed streams with large numbers of interior deletes is now faster and holds locks for less time - **changed** — Inserts, iterations and deletes in AVL sequence sets are now faster in many cases - **changed** — Stream snapshots now attempt to determine the correct encode buffer size up front - **changed** — Reduced memory usage of the structure used to track subjects within a stream - **fixed** — allow_non_tls will no longer log an incorrect message at startup claiming that TLS is required - **fixed** — Combining no_auth_user with auth callouts will no longer skip authentication checks when no CONNECT message is sent - **fixed** — JWT validation no longer crashes the server with whitespace-only permissions - **fixed** — Several paths that enforce the permissions of queue subscriptions no longer treat the whole permission as a subject literal - **fixed** — Several JetStream and MQTT endpoints now correctly guard against null values in JSON - **security** — Fixed an authentication bypass with TLS verify_and_map authenticating users with blank passwords - **fixed** — The healthz endpoint will now skip and no longer report on expired JWT accounts ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.5 (#8435) ###### Dependencies - github.com/klauspost/compress v1.19.0 (#8385) - golang.org/x/crypto v0.54.0 (#8385) - golang.org/x/sys v0.47.0 (#8385) - github.com/antithesishq/antithesis-sdk-go v0.7.2-default-no-op (#8385) ###### Improved JetStream - The Raft transport layer has been decoupled, improves testing but does not change server behaviour (#8181) - The disk concurrency semaphore has been increased to 4096 slots, up from the previous CPU-scaled count (#8336) - The disk concurrency semaphore can now be configured with the `max_concurrent_io` option in the `jetstream` config block (#8336) - Filestore underlying block cache buffers are now recycled to the pool when the weak reference is collected by the GC, which should smooth out memory usage with some usage patterns (#8395) - Calculating and looking up sequences in delete maps for file-backed streams with large numbers of interior deletes is now faster and holds locks for less time (#8403) - Inserts, iterations and deletes in AVL sequence sets are now faster in many cases, which speeds up the tracking of interior deletes (#8406) - Stream snapshots now attempt to determine the correct encode buffer size up front, avoiding many unnecessary allocations on streams with large numbers of interior deletes (#8405) - Reduced memory usage of the structure that is used to track subjects within a stream (#8412) ###### Fixed General - `allow_non_tls` will no longer log an incorrect message at startup claiming that TLS is required (#8420) - Combining `no_auth_user` with auth callouts will no longer skip authentication checks when no `CONNECT` message is sent - JWT validation no longer crashes the server with whitespace-only permissions - Several paths that enforce the permissions of queue subscriptions no longer treat the whole permission as a subject literal - Several JetStream and MQTT endpoints now correctly guard against null values in JSON - Fixed an authentication bypass with TLS `verify_and_map` authenticating users with blank passwords Monitoring - The `healthz` endpoint will now skip and no longer report on expired JWT accounts (#8379, thanks to @ByapakSigdel) - The `varz` endpoint will now correctly report JetStream limits after they were changed via a config reload (#8394) JetStream - Malformed cluster replicated acks or delivered updates are now correctly rejected by the decoder (#8284, thanks to @uwezkhan) - Malformed cluster replicated skip or reset updates are now correctly rejected by the decoder (#8345, thanks to @uwezkhan) - Empty cluster replicated entries are now correctly ignored (#8347, thanks to @uwezkhan) - Decoded AVL sequence set node counts are now validated correctly on 32-bit systems (#8355, thanks to @uwezkhan) - Stale error responses on source or mirror creation are now dropped by recreating the subscription (#8356) - Oversized cluster replicated messages are now validated correctly on 32-bit systems (#8357, thanks to @uwezkhan) - Raft elections now correctly ignore votes from removed peers (#8353) - Filestore blocks with unsynced or truncated key files are now removed and counted as lost data instead of failing to recover altogether (#8365) - Filestore encryption key files are now synced to disk more aggressively (#8366) - Raft now handles the append entry iterator returning no more entries correctly (#8372) - Fixed string ownership when handling the expected last sequence per subject in a batch (#8377) - Fixed a race condition between concurrent message removals via limits that could unexpectedly disable writes into a filestore (#8378) - Fixed a bug in the filestore which could prevent some filestore block cache references from being weakened correctly _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.4]_ ### v2.12.14 — Release v2.12.14 - Date: 2026-07-30 - Version: v2.12.14 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.12.14 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.12.14 - **changed** — Increase disk concurrency semaphore to 4096 slots, up from the previous CPU-scaled count - **added** — Add max_concurrent_io option in the jetstream config block to configure disk concurrency semaphore - **changed** — Recycle filestore underlying block cache buffers to the pool when the weak reference is collected by the GC - **changed** — Improve performance of inserts, iterations and deletes in AVL sequence sets - **changed** — Stream snapshots now determine the correct encode buffer size up front to avoid unnecessary allocations - **changed** — Reduce memory usage of the structure that tracks subjects within a stream - **fixed** — allow_non_tls will no longer log an incorrect message at startup claiming that TLS is required - **fixed** — Combining no_auth_user with auth callouts will no longer skip authentication checks when no CONNECT message is sent - **fixed** — JWT validation no longer crashes the server with whitespace-only permissions - **security** — Fix authentication bypass with TLS verify_and_map authenticating users with blank passwords - **fixed** — The healthz endpoint will now skip and no longer report on expired JWT accounts - **fixed** — The varz endpoint will now correctly report JetStream limits after they were changed via a config reload - **fixed** — Malformed cluster replicated acks or delivered updates are now correctly rejected by the decoder - **fixed** — Malformed cluster replicated skip or reset updates are now correctly rejected by the decoder - **fixed** — Raft elections now correctly ignore votes from removed peers - **fixed** — Filestore encryption key files are now synced to disk more aggressively - **fixed** — Attempting to update the consumer storage type now correctly returns an error - **fixed** — Stream publish checks will now correctly reject messages that exceed the maximum store size before proposal - **fixed** — Creating a clustered consumer immediately after creating a clustered stream should no longer respond with a stream not found error - **fixed** — MQTT packet identifiers for QoS1 and QoS2 are now issued by a monotonic counter, avoiding accidental ID reuse ##### Changelog ###### Go Version - 1.25.12 (#8435) ###### Dependencies - github.com/klauspost/compress v1.19.0 (#8385) - golang.org/x/crypto v0.54.0 (#8385) - golang.org/x/sys v0.47.0 (#8385) - github.com/antithesishq/antithesis-sdk-go v0.7.2-default-no-op (#8385) ###### Improved JetStream - The Raft transport layer has been decoupled, improves testing but does not change server behaviour (#8181) - The disk concurrency semaphore has been increased to 4096 slots, up from the previous CPU-scaled count (#8336) - The disk concurrency semaphore can now be configured with the `max_concurrent_io` option in the `jetstream` config block (#8336) - Filestore underlying block cache buffers are now recycled to the pool when the weak reference is collected by the GC, which should smooth out memory usage with some usage patterns (#8395) - Inserts, iterations and deletes in AVL sequence sets are now faster in many cases, which speeds up the tracking of interior deletes (#8406) - Stream snapshots now attempt to determine the correct encode buffer size up front, avoiding many unnecessary allocations on streams with large numbers of interior deletes (#8405) - Reduced memory usage of the structure that is used to track subjects within a stream (#8412) ###### Fixed General - `allow_non_tls` will no longer log an incorrect message at startup claiming that TLS is required (#8420) - Combining `no_auth_user` with auth callouts will no longer skip authentication checks when no `CONNECT` message is sent - JWT validation no longer crashes the server with whitespace-only permissions - Several paths that enforce the permissions of queue subscriptions no longer treat the whole permission as a subject literal - Several JetStream and MQTT endpoints now correctly guard against null values in JSON - Fixed an authentication bypass with TLS `verify_and_map` authenticating users with blank passwords Monitoring - The `healthz` endpoint will now skip and no longer report on expired JWT accounts (#8379, thanks to @ByapakSigdel) - The `varz` endpoint will now correctly report JetStream limits after they were changed via a config reload (#8394) JetStream - Malformed cluster replicated acks or delivered updates are now correctly rejected by the decoder (#8284, thanks to @uwezkhan) - Malformed cluster replicated skip or reset updates are now correctly rejected by the decoder (#8345, thanks to @uwezkhan) - Empty cluster replicated entries are now correctly ignored (#8347, thanks to @uwezkhan) - Decoded AVL sequence set node counts are now validated correctly on 32-bit systems (#8355, thanks to @uwezkhan) - Oversized cluster replicated messages are now validated correctly on 32-bit systems (#8357, thanks to @uwezkhan) - Raft elections now correctly ignore votes from removed peers (#8353) - Filestore encryption key files are now synced to disk more aggressively (#8366) - Raft now handles the append entry iterator returning no more entries correctly (#8372) - Fixed a bug in the filestore which could prevent some filestore block cache references from being weakened correctly, which could result in unexpected memory usage and GC pressure (#8380) - Attempting to update the consumer storage type now correctly returns an error (#8382) - Stream publish checks will now correctly reject messages that exceed the maximum store size before proposal (#8389) - Creating a clustered consumer immediately after creating a clustered stream should no longer respond with a `stream not found` error (#8410) - Replicated streams that were recreated while a node was down are no longer treated as an update by a returning node processing a snapshot, avoiding stale Raft groups from continuing to run and unexpected behaviour with consumers (#8413) - Stream snapshot endpoints now more strictly check the reply subject for validity MQTT - Packet identifiers for QoS1 and QoS2 are now issued by a monotonic counter, avoiding acciden _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.12.14]_ ### v2.14.3 — Release v2.14.3 - Date: 2026-06-29 - Version: v2.14.3 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.3 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.3 - **changed** — Per-connection log lines have been demoted to debug level - **changed** — Writer options are now applied consistently when using the s2_fast compression mode - **changed** — Stream and consumer assignment handling has been refactored for more consistent migration and info behavior - **changed** — Meta, stream and consumer write errors are now registered more consistently for health and recovery handling - **removed** — JSONP callback support has been removed from monitoring endpoints - **fixed** — Long-running reconnect and OCSP loops no longer retain unused timers, reducing memory pressure over time - **fixed** — Inherited JWT default permissions are now refreshed when account claims are updated - **fixed** — External auth configuration is now cleared correctly when account claims are updated - **fixed** — PROXY protocol detection, TLS sniffing with allow_non_tls and PROXY v1 address-family parsing have been fixed - **fixed** — A race in gateway CONNECT handling has been fixed - **fixed** — Trusted proxy tracking no longer leaks closed clients during concurrent updates - **fixed** — Service import replies can now be delivered across cluster routes - **fixed** — Message tracing now works correctly with service imports and exports - **fixed** — NoAuthUser now checks connection restrictions - **fixed** — Leaf connections no longer bypass Nats-Trace-Dest publish permission checks - **fixed** — CONNZ and SUBSZ pagination now guard against Offset and Limit integer overflow panics - **fixed** — Fixed a nil pointer panic when starting up when the resolver parent directory is missing - **fixed** — Partial CONNECT packets can no longer exhaust pre-authentication memory - **fixed** — PUBLISH remaining-length underflow no longer causes a server panic ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.4 (#8281) ###### Dependencies - golang.org/x/crypto v0.53.0 (#8297) - golang.org/x/sys v0.46.0 (#8297) - github.com/nats-io/jwt/v2 v2.8.2 - github.com/nats-io/nkeys v0.4.16 ###### Improved General - Per-connection log lines that could be noisy in normal operation have been demoted to debug level (#8289) - Writer options are now applied consistently when using the `s2_fast` compression mode (#8047) JetStream - Stream and consumer assignment handling has been refactored for more consistent migration and info behavior (#8262) - Meta, stream and consumer write errors are now registered more consistently for health and recovery handling (#8293) ###### Removed Monitoring - JSONP callback support has been removed from monitoring endpoints ###### Fixed General - Long-running reconnect and OCSP loops no longer retain unused timers, reducing memory pressure over time (#8204) - Inherited JWT default permissions are now refreshed when account claims are updated (#8276) - External auth configuration is now cleared correctly when account claims are updated (#8275) - PROXY protocol detection, TLS sniffing with `allow_non_tls` and PROXY v1 address-family parsing have been fixed (#8302) - A race in gateway `CONNECT` handling has been fixed (#8306) - Trusted proxy tracking no longer leaks closed clients during concurrent updates (#8307) - Service import replies can now be delivered across cluster routes (#8317) - Message tracing now works correctly with service imports and exports - Several panic, fatal and data race conditions in authentication, routing, monitoring and clustered request handling have been fixed - `NoAuthUser` now checks connection restrictions - Leaf connections no longer bypass `Nats-Trace-Dest` publish permission checks - `CONNZ` and `SUBSZ` pagination now guard against `Offset` and `Limit` integer overflow panics - Fixed a nil pointer panic when starting up when the resolver parent directory is missing (#8329) MQTT - Partial `CONNECT` packets can no longer exhaust pre-authentication memory - `PUBLISH` remaining-length underflow no longer causes a server panic - Subscriptions to internal `$MQTT.deliver.pubrel` subjects are now rejected - Subscribe deny rules are now enforced on retained message and QoS replay paths - WebSocket `/mqtt` upgrades no longer panic when MQTT is disabled Monitoring - JetStream remote usage updates no longer panic on length integer overflow JetStream - A data race on the cluster meta node during JetStream shutdown has been fixed (#8260) - Meta proposal inflight tracking is now kept consistent during stream moves and related operations (#8261) - Stream catchup is no longer skipped when limits are exceeded, preventing possible stream desync (#8265) - Malformed TTL and schedule state is now rejected during decode (#8269) - Zero consumer limits are now treated as unlimited during stream updates (#8286) - Raft nodes no longer participate in voting or candidacy after write errors (#8290) - Raft checkpoint handling now aborts if the node is closed (#8296) - Raft `ApplyCommit` now handles the post-snapshot index correctly (#8321) - Consumer ack subscriptions now match correctly when consumer names contain `%` (#8301) - Observer state is now cleared correctly during `js_cluster_migrate` when a leaf remote is removed (#8304) - Atomic batch end-of-batch max-size checks and R1 message rewrites have been fixed (#8305) - Schedule drift, failed fast batch commits with `gapOk` and stale `/varz` leaf remote state have been fixed (#8308) - Peer state decoding now bounds peer ID reads to the buffer length (#8310) - Counter stream staging no longer corrupts the committed running total (#8311) _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.3]_ ### v2.12.12 — Release v2.12.12 - Date: 2026-06-29 - Version: v2.12.12 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.12.12 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.12.12 - **changed** — Per-connection log lines that could be noisy in normal operation have been demoted to debug level - **changed** — Writer options are now applied consistently when using the s2_fast compression mode - **changed** — Stream and consumer assignment handling has been refactored for more consistent migration and info behavior - **changed** — Meta, stream and consumer write errors are now registered more consistently for health and recovery handling - **removed** — JSONP callback support has been removed from monitoring endpoints - **fixed** — Inherited JWT default permissions are now refreshed when account claims are updated - **fixed** — External auth configuration is now cleared correctly when account claims are updated - **fixed** — PROXY protocol detection, TLS sniffing with allow_non_tls and PROXY v1 address-family parsing have been fixed - **fixed** — A race in gateway CONNECT handling has been fixed - **fixed** — Trusted proxy tracking no longer leaks closed clients during concurrent updates - **fixed** — Service import replies can now be delivered across cluster routes - **fixed** — Message tracing now works correctly with service imports and exports - **fixed** — Several panic, fatal and data race conditions in authentication, routing, monitoring and clustered request handling have been fixed - **fixed** — NoAuthUser now checks connection restrictions - **fixed** — CONNZ and SUBSZ pagination now guard against Offset and Limit integer overflow panics - **fixed** — Fixed a nil pointer panic when starting up when the resolver parent directory is missing - **fixed** — Partial CONNECT packets can no longer exhaust pre-authentication memory - **fixed** — PUBLISH remaining-length underflow no longer causes a server panic - **fixed** — Subscriptions to internal $MQTT.deliver.pubrel subjects are now rejected - **fixed** — Subscribe deny rules are now enforced on retained message and QoS replay paths ##### Changelog ###### Go Version - 1.25.11 ###### Dependencies - golang.org/x/crypto v0.53.0 (#8297) - golang.org/x/sys v0.46.0 (#8297) - github.com/nats-io/jwt/v2 v2.8.2 - github.com/nats-io/nkeys v0.4.16 ###### Improved General - Per-connection log lines that could be noisy in normal operation have been demoted to debug level (#8289) - Writer options are now applied consistently when using the `s2_fast` compression mode (#8047) JetStream - Stream and consumer assignment handling has been refactored for more consistent migration and info behavior (#8262) - Meta, stream and consumer write errors are now registered more consistently for health and recovery handling (#8293) ###### Removed Monitoring - JSONP callback support has been removed from monitoring endpoints ###### Fixed General - Inherited JWT default permissions are now refreshed when account claims are updated (#8276) - External auth configuration is now cleared correctly when account claims are updated (#8275) - PROXY protocol detection, TLS sniffing with `allow_non_tls` and PROXY v1 address-family parsing have been fixed (#8302) - A race in gateway `CONNECT` handling has been fixed (#8306) - Trusted proxy tracking no longer leaks closed clients during concurrent updates (#8307) - Service import replies can now be delivered across cluster routes (#8317) - Message tracing now works correctly with service imports and exports - Several panic, fatal and data race conditions in authentication, routing, monitoring and clustered request handling have been fixed - `NoAuthUser` now checks connection restrictions - `CONNZ` and `SUBSZ` pagination now guard against `Offset` and `Limit` integer overflow panics - Fixed a nil pointer panic when starting up when the resolver parent directory is missing (#8329) MQTT - Partial `CONNECT` packets can no longer exhaust pre-authentication memory - `PUBLISH` remaining-length underflow no longer causes a server panic - Subscriptions to internal `$MQTT.deliver.pubrel` subjects are now rejected - Subscribe deny rules are now enforced on retained message and QoS replay paths - WebSocket `/mqtt` upgrades no longer panic when MQTT is disabled Monitoring - JetStream remote usage updates no longer panic on length integer overflow JetStream - A data race on the cluster meta node during JetStream shutdown has been fixed (#8260) - Meta proposal inflight tracking is now kept consistent during stream moves and related operations (#8261) - Stream catchup is no longer skipped when limits are exceeded, preventing possible stream desync (#8265) - Malformed TTL and schedule state is now rejected during decode (#8269) - Zero consumer limits are now treated as unlimited during stream updates (#8286) - Raft nodes no longer participate in voting or candidacy after write errors (#8290) - Raft checkpoint handling now aborts if the node is closed (#8296) - Raft `ApplyCommit` now handles the post-snapshot index correctly (#8321) - Consumer ack subscriptions now match correctly when consumer names contain `%` (#8301) - Atomic batch end-of-batch max-size checks and R1 message rewrites have been fixed (#8305) - Peer state decoding now bounds peer ID reads to the buffer length (#8310) - Counter stream staging no longer corrupts the committed running total (#8311) - Filestore compaction no longer corrupts compressed or encrypted blocks (#8312) - Memory store `NumPending` no longer overcounts for `DeliverLastPerSubject` consumers (#8313) - Consumer inactive-delete grace period handling and pull request `MaxBytes` budgeting have been fixed (#8314) - `MultiLastSeqs` no longer reorders stream config subjects through `filterIsAll` handling (#8315) - Meta recovery snapshots no longer leave phantom streams or consumers behind (#8324) - Skipped messages last time no longer violates ordering that could lead to issues with starting by time (#8237) - Raft now reverts uncommitted me _[Truncated at 4000 characters — full notes: https://github.com/nats-io/nats-server/releases/tag/v2.12.12]_ ### v2.12.11 — Release v2.12.11 - Date: 2026-06-09 - Version: v2.12.11 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.12.11 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.12.11 - **fixed** — Fixed a regression introduced in v2.12.7 which could result in stale subject state tracking which could manifest in "Message Not Found" errors when a max messages per subject limit is configured ##### Changelog Refer to the [2.12 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_212) for backwards compatibility notes with 2.11.x. ###### Go Version - 1.25.11 ###### Fixed JetStream - Fixed a regression introduced in v2.12.7 which could result in stale subject state tracking which could manifest in "Message Not Found" errors when a max messages per subject limit is configured (#8285) - Please note that v2.14.x versions are not affected ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.12.10...v2.12.11 ### v2.14.2 — Release v2.14.2 - Date: 2026-06-02 - Version: v2.14.2 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.14.2 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.14.2 - **changed** — Client ID is now available through the embedded ClientAuthentication API - **fixed** — Fixed a race condition when handling subscription interest over routes - **fixed** — Fixed potential protocol-level corruption from rewriting $JS.ACK subjects - **fixed** — Fixed potential protocol-level corruption from buffer misuse in compressed WebSocket clients - **fixed** — The /accstatz monitoring endpoint no longer omits accounts with only leaf connections - **fixed** — Fixed a case where Raft peers were not correctly tracked after an inactivity stall during catchup - **fixed** — Quorum needed is now calculated correctly when bootstrapping the metalayer when gateway URLs resolve to multiple IP addresses - **fixed** — The filestore no longer performs a block skip check on streams with extremely high subject counts that could result in runaway CPU usage - **fixed** — Fixed a case where the filestore would not release a lock after handling a write error - **fixed** — Purge operations on both file and memory stores are now more consistent with each other - **fixed** — Fixed a case where the consumer lock would not release a lock after handling a start sequence error - **fixed** — Counter streams and message schedules now have configuration constraints applied to prevent incorrect usage patterns - **fixed** — Improved stream and consumer scale down behaviour consistency - **fixed** — Fixed an issue where the per-subject state last block was not stored correctly with a max messages per subject limit of 1 - **fixed** — Fixed a drift that could occur in the peer sets after a peer remove of an online node ##### Changelog Refer to the [2.14 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_214) for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped. ###### Go Version - 1.26.3 ###### Dependencies - golang.org/x/crypto v0.52.0 - golang.org/x/sys v0.45.0 - github.com/nats-io/jwt/v2 v2.8.2 - github.com/nats-io/nkeys v0.4.16 ###### Improved General - The client ID is now available through the embedded `ClientAuthentication` API (#8217) ###### Fixed General - A race condition when handling subscription interest over routes has been fixed (#8235) - Potential protocol-level corruption from rewriting `$JS.ACK` subjects has been fixed (#8242) - Potential protocol-level corruption from buffer misuse in compressed WebSocket clients has been fixed (#8244) - The `/accstatz` monitoring endpoint no longer omits accounts with only leaf connections (#8252) JetStream - Fixed a case where Raft peers were not correctly tracked after an inactivity stall during catchup (#8226) - Quorum needed is now calculated correctly when bootstrapping the metalayer when gateway URLs resolve to multiple IP addresses (#8238) - The filestore no longer performs a block skip check on streams with extremely high subject counts, as it could result in runaway CPU usage (#8227) - Fixed a case where the filestore would not release a lock after handling a write error (#8232) - Purge operations on both file and memory stores are now more consistent with each other (#8241) - Fixed a case where the consumer lock would not release a lock after handling a start sequence error (#8230) - Counter streams and message schedules now have configuration constraints applied to prevent incorrect usage patterns (#8240) - Improved stream and consumer scale down behaviour consistency (#8253) - Fixed an issue where the per-subject state last block was not stored correctly with a max messages per subject limit of 1 (#8254) - Fixed a drift that could occur in the peer sets after a peer remove of an online node (#8258) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.14.1...v2.14.2 ### v2.12.10 — Release v2.12.10 - Date: 2026-06-02 - Version: v2.12.10 - Original notes: https://github.com/nats-io/nats-server/releases/tag/v2.12.10 - Permalink: https://whatsnew.fyi/product/nats/releases/v2.12.10 - **added** — The client ID is now available through the embedded ClientAuthentication API - **fixed** — A race condition when handling subscription interest over routes has been fixed - **fixed** — Potential protocol-level corruption from rewriting $JS.ACK subjects has been fixed - **fixed** — Potential protocol-level corruption from buffer misuse in compressed WebSocket clients has been fixed - **fixed** — The /accstatz monitoring endpoint no longer omits accounts with only leaf connections - **fixed** — Fixed a case where Raft peers were not correctly tracked after an inactivity stall during catchup - **fixed** — Quorum needed is now calculated correctly when bootstrapping the metalayer when gateway URLs resolve to multiple IP addresses - **fixed** — The filestore no longer performs a block skip check on streams with extremely high subject counts, as it could result in runaway CPU usage - **fixed** — Purge operations on both file and memory stores are now more consistent with each other - **fixed** — Counter streams and message schedules now have configuration constraints applied to prevent incorrect usage patterns - **changed** — Improved stream and consumer scale down behaviour consistency - **fixed** — Fixed an issue where the per-subject state last block was not stored correctly with a max messages per subject limit of 1 - **fixed** — Fixed a drift that could occur in the peer sets after a peer remove of an online node ##### Changelog Refer to the [2.12 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_212) for backwards compatibility notes with 2.11.x. ###### Go Version - 1.25.10 ###### Dependencies - golang.org/x/crypto v0.52.0 - golang.org/x/sys v0.45.0 - github.com/nats-io/jwt/v2 v2.8.2 - github.com/nats-io/nkeys v0.4.16 ###### Improved General - The client ID is now available through the embedded `ClientAuthentication` API (#8217) ###### Fixed General - A race condition when handling subscription interest over routes has been fixed (#8235) - Potential protocol-level corruption from rewriting `$JS.ACK` subjects has been fixed (#8242) - Potential protocol-level corruption from buffer misuse in compressed WebSocket clients has been fixed (#8244) - The `/accstatz` monitoring endpoint no longer omits accounts with only leaf connections (#8252) JetStream - Fixed a case where Raft peers were not correctly tracked after an inactivity stall during catchup (#8226) - Quorum needed is now calculated correctly when bootstrapping the metalayer when gateway URLs resolve to multiple IP addresses (#8238) - The filestore no longer performs a block skip check on streams with extremely high subject counts, as it could result in runaway CPU usage (#8227) - Purge operations on both file and memory stores are now more consistent with each other (#8241) - Counter streams and message schedules now have configuration constraints applied to prevent incorrect usage patterns (#8240) - Improved stream and consumer scale down behaviour consistency (#8253) - Fixed an issue where the per-subject state last block was not stored correctly with a max messages per subject limit of 1 (#8254) - Fixed a drift that could occur in the peer sets after a peer remove of an online node (#8258) ###### Complete Changes https://github.com/nats-io/nats-server/compare/v2.12.9...v2.12.10