v2.14.0

nats-io/nats-serverv2.14.0Apr 30, 2026by github-actions[bot]

AI Summary

A major feature release introducing significant JetStream enhancements including fast batch publishing, repeating/cron-based message schedules, and domain-aware ack/flow control. It also introduces feature flags and skips version 2.13.

Key Highlights

  • Fast-ingest batch publishing for high-speed message ingestion
  • Repeating & cron-based message schedules using `@every` or crontab syntax
  • Scheduled subject sampling and rollup capabilities
  • Consumer reset API to reset state without deletion
  • Domain-aware ack and flow control subjects (disabled by default)

New Features

  • Fast-ingest batch publishing
  • Repeating & cron-based message schedules
  • Scheduled subject sampling and rollups
  • Consumer reset API
  • Domain-aware ack and flow control subjects
  • Feature flags in server configuration
  • Asynchronous stream state snapshots

Full Release Notes

## 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.2

### Added

General

- Feature flags in the server configuration (#7866)
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-53.md

JetStream

- Fast-ingest batch publishing (#7778, #7892, #7894, #7945)
  - Allows high-speed publishing of message batches into the server when using a supported client
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-50.md#fast-ingest-batch-publishing
- Repeating & cron-based message schedules (#7504, #7687, #7688)
  - The `Nats-Schedule` header can now be configured on a repeating basis, i.e. `@every 5m`, `@hourly` or using crontab-like syntax
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-51.md
- Scheduled subject sampling (#7506)
  - The `Nats-Schedule-Source` header allows sampling the contents of the last message in the stream for a given subject, allowing sampling of values at a different rate to the original publisher
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-51.md#subject-sampling
- Scheduled subject rollups (#7559)
  - The `Nats-Schedule-Rollup` header allows initiating a rollup of the `Nats-Schedule-Target` subject on a scheduled basis
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-51.md
- Consumer reset API (#7489)
  - It is now possible to reset a consumer back to an earlier sequence number using the `$JS.API.CONSUMER.RESET.stream.consumer` API without deleting and recreating it
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-60.md#consumer-delivery-state-reset-api
- Domain-aware ack and flow control subjects (#7860)
  - This is disabled by default and can be enabled with the `js_ack_fc_v2` feature flag, this will be enabled by default in v2.15
  - In an environment where ACLs are used to control ack or flow control subjects, updates will be required to match the new `$JS.ACK.domain.acchash.stream.consumer.>` and `$JS.FC.domain.acchash.stream.consumer.>` subject formats
- Asynchronous stream state snapshots for replicated streams (#7876)
  - Allows stream state snapshots to be taken and written without pausing stream processing, improving tail latencies
  - This is particularly impactful in cases where the stream has a large number of interior deletes
- Ability to disable message deduplication when sourcing (#7651)

Leafnodes

- Leafnode remote configurations can now be added and removed at runtime by reloading the configuration (#7937)
- New `ignore_discovered_servers` option for leafnode remotes to allow ignoring any leafnode URLs sent by the hub (#8067)

### Changed

General

- The `traceparent` header is no longer modified by the message tracing (#7755)
  - The sentinel `Nats-Trace-Dest: trace disabled` header value disables all server tracing-related functionality 

JetStream

- Consumers now generate a `404 No Messages` response when using `no_wait` but without setting an expiry when there are no pending messages in the stream (#7466)
- Invalid or divergent consumer state is reset to match the stream state on startup, i.e. after unclean shutdowns (#7692)
- Account info, stream info, stream list, consumer info and consumer list API requests are now queued separately, deprioritising them relative to create-update-delete API operations (#7898)

MQTT

- Retained messages can no longer contain the ASCII DEL character (0x7F) in the subject (#8071)

### Improved

JetStream

- Sourcing and mirroring from interest and workqueue streams is now supported (#7613)
  - When sourcing or mirroring from an interest or workqueue stream, the server automatically upgrades to a durable consumer with `AckFlowControl` policy and uses consumer reset where necessary
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-60.md
- End-of-batch commit support for atomic batch publishing (#7403)
  - Batches can now be committed after already having sent the last message with `Nats-Batch-Commit: eob`, which indicates the batch is to be committed, but this last message is purely used to commit and doesn't get persisted
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-50.md
- Rollups are now allowed if the stream has reached the `discard_new_per_subject` limit (#7974)
- Raft nodes will step down if overrun (#7853)

### Fixed

JetStream

- Raft nodes will no longer start if the snapshot is missing or corrupt, or if the snapshot doesn't align with the remaining log on disk, avoiding potential data loss (#7566, #7580, #7620)
- Filestore operations now handle read and write errors from the filesystem more thoroughly (#7788)
- Filestore recovers from partial purge after hard kill (#7676)
- Consistent Raft group rename when moving to or off R1 (#7802)

### Complete Changes
 
https://github.com/nats-io/nats-server/compare/v2.12.0...v2.14.0