NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
NuGet · #3098 most downloaded on NuGet
The TigerBeetle client for C# and .NET
Last release 3 months ago
06 Jul 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
127 years old
300 releases · first in 1900
Revert unique keys, which caused compatibility issues (see #3802).
Released: 2026-07-03
Revert unique keys, which caused compatibility issues (see #3802).
Extend inspect constants to catch schema changes and prints
the Checkpoint Schedule section.
Micro-optimization to the radix sort algorithm to avoid copies when dealing with large stack-allocated values.
Online schema validation, ensuring coherent key_min/key_max when reading data.
Improve the Ruby client migration guide.
Various docs improvements, including adding the Ruby client and print layout support.
Add a u128 bounds check in the Ruby client and make its status return type more idiomatic.
Improve the Rust client, removing the bitflags dependency and enabling overflow checks.
Experimental CLI --memory flag that automatically sizes the grid and object caches to use
all assigned memory.
Improve various code comments.
Switch to stdx.SocketAddress.
Fail on curl instead of unzip for network flakes during Vortex builds.
Expose TimeSim and fixtures in VSR.
Introduce the canonical workload principle for benchmarks.
Make publishing TigerBeetle client artifacts idempotent.
Workaround MacOS builds on Zig 0.14.1 (see issue).
One column per quarter.
Fix a bug in which the stash would overflow due to excess tombstones.
Released: 2026-06-19
Fix a bug in which the stash would overflow due to excess tombstones.
Fuzz scans over mutable secondary indexes, and fix an assertion.
Fix commit stall injection for clusters with 8 or more active clients.
Add case conversion helpers to stdx.
Add stdx.net with IP address implementation.
Add FuzzIterations abstraction to control fuzzer smoke test duration.
Note: it is advisable to skip 0.17.6 and 0.17.7 and upgrade directly to 0.17.8 due to a potential crash. If you encounter the crash, it can be mitigat
Released: 2026-06-12
Note: it is advisable to skip 0.17.6 and 0.17.7 and upgrade directly to 0.17.8 due to a potential crash. If you encounter the crash, it can be mitigated by temporarily increasing the object cache size. See #3802.
Significantly improve the TigerBeetle REPL parser. Ensure that users see correct and useful error messages, and fix some inconsistencies.
Introduce snapshot testing and proper fuzzing, which allowed fixing some latent parsing bugs.
Replace hatchling as the TigerBeetle python client packager with our own zig wheel builder,
which allows reproducible builds without dependencies.
Allow passing timeouts for all shell operations called from zig tooling.
Ensure CI release and release validation jobs don't run concurrently to reduce flakes induced by CI job race conditions.
Note: it is advisable to skip 0.17.6 and 0.17.7 and upgrade directly to 0.17.8 due to a potential crash. If you encounter the crash, it can be mitigat
Released: 2026-06-05
Note: it is advisable to skip 0.17.6 and 0.17.7 and upgrade directly to 0.17.8 due to a potential crash. If you encounter the crash, it can be mitigated by temporarily increasing the object cache size. See #3802.
Fix resource leak & potential overflow in the .NET, Java, and Go clients.
Thank you @jf-li00 for spotting these!
Substantially reduce tail latency by performing compaction merge incrementally as opposed to a single big merge at the end of the bar.
Make space for replica connections on the accept path, evicting clients or
random peers that may be hogging TCP connections.
Various improvements to the ping-pong protocol between the client and cluster.
Specifically, clients now proactively send a ping while registering a session with the cluster (as opposed to waiting 30 seconds), and the cluster may now respond with an eviction message when a ping is received (as opposed to waiting for the next request from an evicted client).
Improve fuzzing around LSM tree deletions on the lookup path, which now checks for tombstones.
Guarantee that the StateMachine works on cache-line-aligned buffers; callers can take advantage of this alignment to efficiently reinterpret the bytes.
Ban the usage of std.fmt.parseInt, which is useful for interactive use-cases
like CLI/REPL, but a bit too permissive for protocols.
Note: it is advisable to skip 0.17.5 and upgrade directly to 0.17.8 due to a potential crash on upgrade (see #3808).
Released: 2026-05-29
Note: it is advisable to skip 0.17.5 and upgrade directly to 0.17.8 due to a potential crash on upgrade (see #3808).
Fix a possible Node.js integer overflow panic.
Fix a potential crash in the I/O event listener.
Correct assertions in the code.
Run DISCARD when formatting a block device on Linux, improving SSD performance.
Replace Java's assert keyword with AssertionError.assertTrue to prevent silent failures.
Refactor the grid to own all blocks through reference counting.
Inject stalls on the primary more accurately by observing a backup's
op - commit_min, improving throughput.
Fan out VSR prepare timeout retries.
Explicitly fail on invalid enum values in AMQP parsing per Swival security audit recommendation.
Add an assertion to CheckpointTrailer.open as per Swival security audit recommendation.
Add a Ruby client. Thanks @citizen428!
Switch from ArenaAllocator to DebugAllocator to fix ArenaAllocator
rounding up allocations by large amounts.
Improve the names of some VSR commands.
Make release validation run from main, making it easier to fix when release validation fails.
Move shell.zig into stdx, making it more robust for different zig project setups.
Show the freshness of performance results in DevHub.
Cleanup Time usage and drop std.time.Timer uses ahead of its removal in Zig 0.16.
Raise the clock-skew warning threshold from 1ms to 50ms to prevent CI flake.
Introduce configurable primary keys and multiple unique keys to LSM Forests.
This enables querying two-phase transfers by pending_id.
Fix various tb_client issues, enable Rust client CI on Windows.
Remove the cancel_all feature used to shutdown tb_client on Linux, instead terminate message bus
connections explicitly.
Dial up concurrency in the Node.js client test to reliably race destroy against create.
Fix flaky Vörtex and Windows cache CI failures.
As of TigerBeetle 0.17.4, the minimum required Linux kernel version is 5.11.
Released: 2026-05-08
As of TigerBeetle 0.17.4, the minimum required Linux kernel version is 5.11.
Refactor and simplify the Linux IO event loop, by directly embedding a timeout when calling
io_uring_enter, making next_tick a top level function (instead of executing all callbacks
back to back) and reentering the kernel after each callback.
Combined, these changes give a ~8% improvement on the standard benchmark, improve tail latencies in certain edge cases, as well as prevent tick starvation under heavy load or slow disks.
Fix a bug in reformat caused by invoking IO.run from within IO.run_for_ns.
Track the object caches as metrics, to help with sizing (e.g., --cache-accounts).
Fix file permissions to no longer ask for world readable/writable files when creating them.
Normally, this does get prevented by the default umask.
Add warnings when the event loop is slow.
Cache the Zig download for test workflows, add the flake count to Devhub and miscellaneous CI fixes.
Switch replication strategy from adaptive replication routing to star.
Released: 2026-05-01
Switch replication strategy from adaptive replication routing to star.
Star replication involves the primary broadcasting prepares to all backups and handles network jitter better, leading to lower p100 latencies in cross-region deployments.
Guard against supply-chain attacks via GitHub actions by pinning them to the latest commit SHAs.
Recompute the checksum body only for operations that modify the body.
Simplify the control flow of Zig-Zag merge using galloping search, to drain the keys and avoid rebuilding the tree multiple times.
Workaround various flakes caused by GitHub actions.
Specifically, actions cache flakes on Windows, and gh run list
sometimes returns no response.
Fix a flaky client test due to an overly conservative timeout for expiring transfers.
Make release validation work cross-platform.
Fix the Go client documentation for posting/voiding pending transfers.
When a replica sends a message to itself, copy in message body before computing checksum_body and checksum.
Released: 2026-04-24
When a replica sends a message to itself, copy in message body before computing
checksum_body and checksum.
Track value_count_visible as a metric, per tree.
This is useful for counting the number of accounts/transfers in the database.
Test that checksum works on unaligned data.
Make VSR repair less eager, cutting request_prepare traffic by ~70-80% and request_headers by ~80-90% for minor overhead.
Released: 2026-04-17
Make VSR repair less eager, cutting request_prepare traffic by ~70-80% and
request_headers by ~80-90% for minor overhead.
Improve compaction table-selection from O(a * log b) to O(a + b), especially
noticeable at 20TB+.
Refactor stdx.flags to own its allocator and return trailing -- args as a slice.
Rename VSR view-change messages: DoViewChange -> JoinView, StartView -> View,
StartViewChange -> ExitView.
Re-enable VOPR in CI.
Increase tick budget for the Vortex upgrade/recover test, which was occasionally timing out.
CI: fetch git tags in the release-validate job.
Docs: drop an overly wide comparison table from the API changes page.
Docs: remove references to the retired Startup Program.
Clean up TigerTracks in CHANGELOG.md by only using song titles.
This release improves create_accounts and create_transfers operations. They now return timestamps of newly created objects, allowing the application t
Released: 2026-04-10
This release improves create_accounts and create_transfers operations. They now return
timestamps of newly created objects, allowing the application to learn the resulting global order
of events without additional roundtrips. As usual, this release remains wire-compatible with
previous clients. To gain access to the new APIs, please upgrade clients to version 0.17.0. Refer
to the API changes page for details.
Improve repair performance by tracking per-replica repair budgets, to prevent a slow replica from tying up the global budget.
Add randomness to repair timeouts and faulty block iteration, to guard against resonance liveness bugs.
Test cluster upgrades using real TigerBeetle binaries in Vortex.
Change the return type and semantics of the create_{accounts,transfers}.
Add the API changes page to the docs: https://docs.tigerbeetle.com/coding/api-changes.
Remove default initialization from Python client's AccountFilter and QueryFilter.
Querying with a limit which would not fit in the maximum message size now
fails with TooMuchData in the client, rather than silently truncating results.
Add metric tracking recent client min/max releases seen by the cluster.
Fix several bugs in the client_request_round_trip metric.
Make the Golang client API more idiomatic using *big.Int.
While generating a TigerBeetle time-based ID, clients now wrap the random bits and increment the timestamp bits when the former overflows.
Earlier, clients panicked when random bits overflowed on increment.
Cache Zig compiler on CI.
IO/Linux: Add another attempt to the flock() retry loop.
Various Vortex and CFO fixes.
Docs: Clarify the number of replicas required for upgrades.
Docs: Fix a flipped account flag in balance-invariant-transfers.md.
Fix an over-tight assert -- we may still be writing non-repair blocks at the start of checkpointing.
Released: 2026-03-20
Fix an over-tight assert -- we may still be writing non-repair blocks at the start of checkpointing.
Fix a potential liveness issue where we try to repair a block while simultaneously writing to it.
tigerbeetle inspect constants now prints out the number of Transfers per table.
#3579, #3589, #3591, #3584, #3594
Fix the CI release validation job.
Refactor our iops.zig to a more appropriate home in stdx.
Note: it is advisable to skip 0.16.77 and upgrade directly to 0.16.78, due to potential liveness issues (see #3581 and #3586).
Released: 2026-03-13
Note: it is advisable to skip 0.16.77 and upgrade directly to 0.16.78, due to potential liveness issues (see #3581 and #3586).
Rework how eviction is signaled in tb_client to avoid race conditions between eviction and
shutdown, unify notification logic, and add assertions for running on the correct thread.
Optimize compaction performance by removing IO stalls at the end of each beat, allowing IO to overlap with other work and increasing throughput by ~4%.
Allow the grid to serve reads directly from write queues, improving performance for blocks being currently repaired or created.
Work around a miscompilation in Zig's LLVM backend by downcasting alignment in stdx.equal_bytes.
Prepare the Rust client for release by removing dependencies (anyhow, futures-channel),
and setting up automated release builds (not enabled yet).
Fuzz updates on CompositeKeys, identifying a bug in a proposed prefix-only sort optimization.
Add a new metric to track time spent on CPU work, specifically callbacks.
Tighten units for IOPS, concurrency, and durations in config.
Fix worst case sizing and add prefetch in the scan fuzzer, to mirror state machine logic.
Expose CLI arguments to diagnose connectivity issues with AMQP and TigerBeetle during CDC.
Released: 2026-03-06
Expose CLI arguments to diagnose connectivity issues with AMQP and TigerBeetle during CDC.
Users can now specify --amqp-timeout-seconds and --tigerbeetle-timeout-seconds
(both default to 30), which define the maximum time to wait for a reply
from AMQP and TigerBeetle respectively.
Record request timing metrics for reserved VSR operations.
This gives users visibility into the latency of client registrations (the
first request a client sends to the cluster), using the register operation.
Add tidy check to flag functions with length [71, 72], as per TigerStyle.
This check intentionally incentivizes shortening the length to <=70 for functions that are just over, as a starting point towards the 70-line limit.
Various documentation improvements.
Use a fixed, high retry delay instead of exponential backoff to work around GitHub availability.
Various refactors and debug logging improvements in compaction.
Add logging to clarify the semantics of multiversion upgrade polling.
Fix the fast path check for key_range_contains. Previously, the fast path would never be taken due to checking snapshot_latest incorrectly.
Released: 2026-02-27
Fix the fast path check for key_range_contains. Previously, the fast path would never be taken
due to checking snapshot_latest incorrectly.
Enable transparent huge pages on Linux - relieving TLB pressure and giving a nice little throughput bump!
Rage against the (GitHub) Machine.
Fix an overestimation of the number of index beats that will be generated by compaction.
Add a replica test for an asymmetric partition where the primary can never receive messages, yet still does not abdicate. This test documents the curr
Released: 2026-02-20
Add a replica test for an asymmetric partition where the primary can never receive messages, yet still does not abdicate. This test documents the current behavior, which must be fixed.
Refactor LSM scan direction handling to simplify key comparisons in ascending and descending order.
Reduce the internal I/O thread stack size of the TigerBeetle client to 512 KiB.
Bump the minimum rustc version to 1.71 for building the TigerBeetle Rust client.
Making AOF recovery deterministic, and prevent interference from non-aof-recovery requests.
Released: 2026-02-13
Making AOF recovery deterministic, and prevent interference from non-aof-recovery requests.
Improve Rust client testing.
Strip tracking parameters from Spotify links.
Include vortex zig driver executable in release artifacts, in preparation for multiversion testing in vortex.
Add metrics tracking LSM write amplification.
Reduce the frequency of metrics tracking in the message bus.
Dramatically improve View Change time with a new FaultDetector that estimates the probability of a primary crash.
Released: 2026-02-06
Dramatically improve View Change time with a new FaultDetector that estimates
the probability of a primary crash.
Track commit_timestamp and message_bus connections.
Add support for rotating AOF files without signals.
#3491 #3496 #3494 #3490 #3495 #3489 #3488
Various documentation improvements and clarifications.
Clarify that PR descriptions are ephemeral and do not replace well-written commit messages.
Capture additional Vortex logs during end-to-end testing.
Code cleanup and an increase in the maximum number of accounts supported by the benchmark.
Nothing published for this version
Add basic tracing/metrics to event loop times. Also fix a bug in "max" timing metrics.
Released: 2026-01-31
Add basic tracing/metrics to event loop times. Also fix a bug in "max" timing metrics.
Rewrite and improve performance of tree-of-losers k-way-merge implementation.
Use callconv(.@"inline") for radix sort key_from_value function.
Add --id-order=tbid to benchmark. This makes the benchmark more accurately resemble a
real-world workload. Additionally, with this setting multiple runs of the benchmark will not
encounter id collisions.
Prefetch index blocks during compaction, so that we don't need to block waiting for the read.
Ensure public contract is stated in the tb_client header file.
Make CFO crash less easily if fuzzer behaves unexpectedly. Also make local testing of CFO more similar to real CFO execution.
Document client cancellation policy.
Released: 2026-01-23
Document client cancellation policy.
Move ARCHITECTURE.md up in the docs hierarchy. It's a part of internal docs, but is well worth reading for anyone curious about TigerBeetle internals!
Enable history by default for tigerbeetle benchmark. Argument-less benchmark captures our
current understanding of a representative workload, so the results are not guaranteed to be
comparable across tigerbeetle versions.
Tighten up CLI parsing to forbid accidentally allowed signs. E.g, --cluster=+0 is now an error.
Make experimental AOF feature a run-time, rather than compile-time flag.
Simplify debugging devhub by cloning (but not pushing) devhub-db during local development.
Use --cache-grid to reduce memory in tests of Rust client.
Simplify state machine by using actual op number instead of symbolic snapshot_latest for LSM
lookups.
Fix a potential resource leak in SegmentedArray during initialization failure.
Released: 2026-01-09
Fix a potential resource leak in SegmentedArray during initialization failure.
Rust client: Display platform information in the error message when attempting to run on unsupported platforms.
Node client: Switch to process.report.getReport() for more reliable Musl libc detection.
Docs: Clarify the prose in the balance-invariant transfer recipe.
Refactor DateTimeUTC to InstantUnix for tracking real, non-monotonic time.
Refactor Vörtex network handling.
Remove confusing "slow request" warning from VSR logs.
Improve logging consistency for headers and checksums. Thanks @fdesu!
Various microbenchmark improvements for checksums, k-way-merge, and binary search.
stdx: Remove stream_precedence, improve shuffle implementation robustness, and document
monotonicity of Instant.
CI and Build: Reduce Java flakiness, remove APK workarounds, simplify release validation, and
deduplicate tb_client builds.
Devhub: Throw Error instead of String in asserts, and support more units.
Minor fixes, tidy ups, and documentation improvements. Thanks @dsp and @amiraliakbari!
Speed up VOPR storage and network during liveness mode for fast convergence, to avoid false positives.
Released: 2025-12-12
Speed up VOPR storage and network during liveness mode for fast convergence, to avoid false positives.
Don't discard high 16 bits of timestamp when generating ID's with the Node.js client.
Relax VOPR condition for truncating acked ops to prevent false positives.
Implement a micro-benchmarking harness, to protect the benchmarks from bitrot.
Add more documentation details around query multibatching.
Make Pending!?Value the canonical stream signature. This type is chosen because it is the
orthogonal composition of iteration and asynchrony.
Prevent "out (disk) of space" failures during CI.
Make DSL for parsing positional CLI flags more natural.
Remove dead code from zig-zag merge join.
Improve how Vörtex handles SIGTERM.
Improve the way we handle ratios in stdx, and refactor parse_flag_value.
Update TigerStyle with more context for the line and function length limits.
Improve some spelling and grammar in start.md. Thanks @elness!
Fix non-monotonic ID generation in the Python client. Thank you for spotting this, @rbino!
Released: 2025-11-21
Fix non-monotonic ID generation in the Python client. Thank you for spotting this, @rbino!
Introduce op_checkpoint_sync to simplify assertions during state sync.
Run Vörtex in CFO (Continuous Fuzzing Orchestrator).
Various fixes for Vörtex in CFO.
Fix overzealous assertion that didn't account for state sync while accepting start view headers.
Released: 2025-11-14
Fix overzealous assertion that didn't account for state sync while accepting start view headers.
Various MessageBus refactors to reduce code bloat.
Earlier, the connection and message passing logic was spread out across the MessageBus and Connection types. Now, all that logic is contained within the MessageBus type, with Connection only maintaining connection state between two peers.
Fix bug in cut_suffix wherein the suffix itself was being returned instead of the prefix.
Make IO file descriptor a Zig optional, as opposed to using INVALID_SOCKET.
Add support for canceling individual inflight IO operations on Linux.
Earlier, Linux IO only allowed canceling all asynchronous in-flight operations.
Parametrize code over Operation rather than the entire StateMachine. Previously, client code used to have a dependency on the implementation code of t
Released: 2025-11-07
Parametrize code over Operation rather than the entire StateMachine. Previously, client code
used to have a dependency on the implementation code of the concrete state machine, whereas it
only needs to know the types of the operations involved.
Remove usize
from constants, scans and CLI arguments.
Remove StateMachine's dependency on a specific StateMachineConfig and rather use the global
constants.
Simplify the Rust client's build script and bring it inline with other clients by making it no longer driver TigerBeetle's build.
Allow backups to accept prepares from the next checkpoint when they replace already committed prepares.
Released: 2025-10-31
Allow backups to accept prepares from the next checkpoint when they replace already committed prepares.
Assert the size of Headers and StartView messages.
Correctly reset the pulse_next_timestamp.
Disable config.verify in release builds, while promoting several assertions gated by verify
to regular assertions.
Fix an unhandled error on unreachable networks that could cause liveness issues.
Also ban all usage of posix.send() in favor of posix.sendto().
Free up about 300MiB of memory by sharing the same buffer for in-place radix sort.
Clarify that the TBID, which is a u128 number, only specifies the bit layout.
Introduces tigerbeetle inspect integrity to verify offline that a data file is uncorrupted.
Prepare the Rust client for publication.
Improve duration parsing by removing ambiguous units and adding fuzz tests.
Update data file documentation to correctly state the grid block size as 512 KiB.
Clarify the release process in case a version of TigerBeetle is skipped.
Fix invalid payload references after modifying the active tag in a tagged union.
Remove unnecessary deduplication logic when scanning from memory tables, since #2592 already introduced deduplication during sorting.
Reserve the maximum release version (65535.x.x) for testing clusters (cluster_id zero).
#3342, #3338, #3330, #3347, #3341
Various Vortex and CFO improvements.
Fix the build command for clients in HACKING.md and other typos. Thanks @gharbi-mohamed-dev!
Enable unit tests for deprecated operations.
Released: 2025-10-17
Enable VOPR to detect when the message limit is exceeded.
Enable unit tests for deprecated operations.
Improve the release process by publishing to npm via trusted publishers.
Rephrase the "debits first" explanation in documentation.
Refactor the message bus to save memory and tighten explicit SendQueue limits.
Implement BoundedArray from scratch.
Remove needless use of bounded array from REPL.
Refactor and cleanup Vortex.
Speed up cluster repair by adapting the pace and distribution of repair requests according to observed network conditions.
Released: 2025-10-03
Speed up cluster repair by adapting the pace and distribution of repair requests according to observed network conditions.
Speed up cluster repair by not delaying execution of committed prepares until the log is fully repaired.
Add a dedicated fuzzer for MessageBus.
Add --log-trace for extra verbose logging.
After successfully adding a test that tests in #3136, we doubled down on this strategy and are adding a metric for tracking metrics.
Use ISO4217 three-letter codes when writing about currencies (so, USD over $).
Clean up Adaptive Replication Routing implementation.
Speed up zig build test by removing false build-time dependencies.
Remove a copy from the StateMachine.
Released: 2025-09-26
Remove a copy from the StateMachine.
Update the k-way-merge to use the new from_seed_testing().
Improve metrics to use a reduce the worst case packet count (and benefit from a small memory saving while we're at it).
Clarified documentation on closing accounts and two-phase transfers. Thanks @raui100!
Refactor references to old time types to use the Instant and Duration types.
Added documentation for our CI entrypoint: zig build ci.
Introduce Least Significant Digit (LSD) radix sort in stdx.
Released: 2025-09-19
Introduce Least Significant Digit (LSD) radix sort in stdx.
Use radix sort in the memory tables to get more performance improvements.
Reduce tail latencies by tracking sorted runs and use k-way merge to sort them.
Collectively, these changes result in the following performance improvements on modern servers (Hetzner AX102):
| Metric | Before | After |
|---|---|---|
| Load accepted (tx/s) | 414,375 | 606,258 |
| Batch latency p100 | 115ms | 75ms |
Use Zig's new std.testing.random_seed to introduce genuine randomness in tests.
Fix a crash due to corruption and misdirection found by the WIP message bus fuzzer.
Fix a bug where grid.cancel was erroneously being invoked during commit_stage=checkpoint_durable.
Released: 2025-09-12
Fix a bug where grid.cancel was erroneously being invoked during commit_stage=checkpoint_durable.
Remove peer type from MessageBuffer, maintaining it only at MessageBus level.
This solves a bug introduced by #3206, due to divergent peer state between MessageBus and MessageBuffer.
Low-level LSM performance improvements. The k-way merge iterator now uses a tournament tree instead of a heap, we skip sorting of the mutable table if it's not needed, and we skip binary search if possible by min/max key ranges.
Use a different PRNG seed for Replica each time, rather than a fixed seed of the replica ID. This PRNG controls things like exponential backoff jitter and the order of the blocks on which the grid scrubber runs.
Introduce --requests-per-second-limit to throttle CDC requests to TigerBeetle.
Usage for this option is orthogonal to --idle-interval-ms and --event-count-max, allowing
fine-tuning for low latency without overflowing the AMQP target queue.
In order to avoid bimodality if a replica is down (e.g., a client sends a request, doesn't hear anything, eventually times out and tries a different replica) clients now proactively send their requests to the primary and a randomly selected replica.
Backups can also send replies directly to clients, meaning that a client could be completely partitioned from the primary, but still remain available.
Mark grid cache blocks as MADV_DONTDUMP, making core dump size tractable even with large caches.
Preparation for the Zig 0.15.1 upgrade.
A host of multiversion improvements! Multiversioning is now a proper interface, rather than being scattered about. Additionally, Windows support is now significantly more robust, and will be integration tested like the other platforms in the next release.
Improved performance in set_associative_cache.zig by using Fastrange and SIMD.
Released: 2025-08-29
Improved performance in set_associative_cache.zig by using Fastrange and SIMD.
Improved performance and better codegen in aegis.zig by avoiding aliasing.
Retain table repair progress across checkpoint boundaries, to reduce the time to complete state sync for active clusters.
Use the NOSIGNAL flag with both asynchronous send and synchronous send_now.
This avoids receiving a possible SIGPIPE signal raised by the kernel.
Improve the Rust client API to make the returned future thread-safe. Thanks @michabp!
Fix the Go client to make the subfolder with external files required by CGO
compatible with go vendor.
Thanks @itzloop.
Fix the Python client to make close() async on ClientAsync.
Removed support for closed loop replication in repair and sync protocols.
Ban equality and inequality comparisons with error values, as they may silently
perform an untyped comparison.
Enforce handling errors with switch blocks instead.
Consolidate all Windows APIs we use (not present in Zig’s std) under stdx.windows.
Improve upgrade tests.
Improve the documentation to explain adaptive routing and add notes about using CDC in production.
Moves the unshare code into stdx.unshare and uses it for both Vortex and CFO.
Also fixes how vortex run was handling the child process error code.
Improve the speed of trailer repairs by initiating repair requests more proactively.
Released: 2025-08-22
Improve the speed of trailer repairs by initiating repair requests more proactively.
Add Vortex to CI to test clients (Java, Zig, Rust).
Ensure only the primary responds to VSR repeat requests.
Add a typed Python client (thanks @stenczelt).
Simplify budgeting for VSR repairs.
Refactor ReleaseList to contain the release logic.
Improve naming for journal and grid message budgets.
Make repair timeout reliably fire in a loaded cluster processing small batches.
Released: 2025-08-15
Make repair timeout reliably fire in a loaded cluster processing small batches.
Make tigerbeetle format concurrent and only write essential data.
This speeds up the time to format considerably.
Cache prepares from the future, to help avoid needing to repair the WAL near checkpoints when a backup is a little behind primary.
Don't unlink data file on formatting failure.
Use correct default statsd port (8125).
Remove translation logic from old checkpoint state to new. Note that this means that
tigerbeetle inspect will no longer decode superblocks from 0.16.25 or older, until
they are upgraded to at least 0.16.26.
Improvements to the balance bounds, rate limiting, and two phase transfers recipes. Thanks @snth!
Use true quine to generate unit tests.
Drop SigIllHandler. This was supposed to print a nice error message on unsupported
architectures, but we hit SigIll in Zig's _start, before we get to our main.
Add constants for KiB thru PiB.
Speed up repair by removing a round-trip to fetch headers.
Released: 2025-08-08
Speed up repair by removing a round-trip to fetch headers.
Check checksums when downloading Zig during the build.
Add documentation for Rust client library.
Test that release artifacts are fully reproducible.
Add a test to test that tests include all the tests.
Remove local variable aliasing as per TigerStyle.
@splat all the things.
Use double-entry accounting for allocations.
Remove git-review.
Show total number of VOPR runs for release.
Allowing EWAH to decode bigger free set into smaller. This fixes the --limit-storage flag.
Released: 2025-08-01
Allowing EWAH to decode bigger free set into smaller. This fixes the --limit-storage flag.
Fix Node.js v24 client.
Add compaction/checkpoint/journal slot count to tigerbeetle inspect.
During tests, verify that grid read errors correspond to either storage faults or ongoing state sync.
Teach snaptest how to decode/encode hex & zon.
Fix typo in manifest_log_fuzz.
Test CreateTransfersResult.exists in VOPR.
stdx refactoring.
Improve repair performance by tracking requested prepares so each is repaired exactly once per timeout.
Released: 2025-07-25
Improve repair performance by tracking requested prepares so each is repaired exactly once per timeout.
In VOPR, model events using nanosecond-resolution timestamps to uncover more interesting interleaving.
Initialize IO and Tracer early. Avoid comptime type specialization.
Update TigerStyle with additional conventions for naming things and ordering struct fields.
Add --requests-max CLI flag to VOPR.
In DevHub, use font-size-adjust to better match sizes of sans and monospace text.
Introduce a fixtures module for fuzzing and testing to avoid code duplication.
Fix incorrect assert in the commit stall logic.
Released: 2025-07-18
Fix incorrect assert in the commit stall logic.
This assert could cause the primary to crash while it is injecting a commit stall, if an old primary has committed ahead of it.
Improve compaction scheduling algorithm to be more performant and memory efficient.
Earlier, during each beat, we used to compact each active tree and level, leading to multiple context switches. Now, we compact each tree and level to completion before moving on to the next.
Add metrics that track the time taken to complete read and write IO.
Remove comptime type specialization on Time and replace it with a runtime interface.
Change all instances of data block -> value block, more aptly named for blocks containing values.
Update architecture documentation to explain how to correctly integrate TigerBeetle into a larger data processing system.
Fix example for voiding pending transfers in the dotnet, go, node, and python clients.
Fix broken link to the Viewstamped Replication paper and some typos in the documentation.
Fix VOPR false positive where we erroneously find two different versions of an uncommitted header.
Refine BoundedArrayType API, renaming functions to be shorter and consistent with Queue and Stack.
Cleanup Zig TODO items that have been resolved with the recent upgrade to Zig 0.14.1.
Released: 2025-07-13
Cleanup Zig TODO items that have been resolved with the recent upgrade to Zig 0.14.1.
Always copy fields from vsr_options to build_options, since Zig 0.14.1 removed anonymous
structs. Thanks @rbino!
Use realtime to enforce budget and refresh timeouts in the CFO.
Remove unwind_tables from release builds and strip client libraries to reduce binary size.
Fix a division by zero when logging CDC metrics, and increase resolution to nanoseconds.
Released: 2025-07-04
Fix a division by zero when logging CDC metrics, and increase resolution to nanoseconds.
Apply backpressure at primary to mitigate an issue with lagging backups.
Upgrade to Zig 0.14.1.
Fix a typo that caused probabilities to be parsed as hexadecimal.
Updates the publishing process for the Java client to conform to the Maven Central Repository due to the OSSRH service end-of-life.
Released: 2025-07-01
Updates the publishing process for the Java client to conform to the Maven Central Repository due to the OSSRH service end-of-life.
Fixes and improvements for tracing and metrics.
Note: This release is missing some client libraries in their respective package managers.
Released: 2025-06-27
Note: This release is missing some client libraries in their respective package managers.
Fix ABI assertions in Rust client.
Swarm test different replication configurations in VOPR.
Supports CDC processing for transfers created by versions earlier than 0.16.29.
Fixes a liveness bug that would crash the replica if a CDC query encountered objects
created with a schema before #2507.
Add client_request_round_trip metric to track end-to-end client request latency.
Support --clients alongside --transfer-batch-delay-us in tigerbeetle benchmark.
The command tigerbeetle inspect constants prints VSR queue sizes.
Define timeouts in terms of tick_ms.
Disable "hint" argument for mmap call, which was observed to cause stack overflow.
Always build tb_client for Rust client in release mode.
Released: 2025-06-19
Always build tb_client for Rust client in release mode.
Prioritize more important fuzzers in CFO.
This release changes the CDC message header to use AMQP signed integers. The new encoding will be handled transparently by RabbitMQ/AMQP clients. Howe
Released: 2025-06-13
This release changes the CDC message header to use AMQP signed integers. The new encoding will be handled transparently by RabbitMQ/AMQP clients. However, code changes might be necessary if the consumer explicitly relies on the unsigned data type.
Fix a liveness bug related to when replicas are syncing.
Fix a crash related to timing when measuring commit timing.
Add documentation on how to monitor TigerBeetle, track requests end-to-end for better monitoring.
Improves compatibility of our new CDC connector by supporting AMQP signed integer types, and
fixes an assertion that previously overlooked the possibility of receiving an asynchronous
basic_ack while publishing a batch of messages.
Thanks @alvinyan-bond for your feedback!
Add a recovery smoke test.
Improve logging for missing replies by including the op number.
Released: 2025-06-06
Improve logging for missing replies by including the op number.
DevHub now displays how many fuzz runs are executed per minute (VPM).
Remove cluster from the MessageBus as part of the MessageBuffer rework.
Handle all message padding uniformly.
Limit the fuzzer processes to 20GiB of RAM.
Prevent stack probing from actually using all of the stack due to unexpected inlining.
This release includes the tigerbeetle recover subcommand, which can be used to _safely_ recover a replica that is permanently lost.
Released: 2025-05-30
This release includes the tigerbeetle recover subcommand, which can be used to safely recover a
replica that is permanently lost.
Additionally, it includes Change Data Capture (CDC) support to stream TigerBeetle state to Advanced Message Queuing Protocol (AMQP) targets, such as RabbitMQ and other compatible brokers.
Check out the documentation to learn about how to use
CDC and tigerbeetle recover!
Add the tigerbeetle recover subcommand, to safely recover a replica that is permanently lost
(e.g. if the SSD fails).
Earlier, the only way to recover a permanently lost replica was using the tigerbeetle format
command. However, this was unsafe, as a newly-formatted replica may nack prepares which its
previous incarnation acked -- a correctness bug.
Implement an adaptive replication routing protocol to handle changes in network topology.
To select the best route, primary uses outcome-focused explore-exploit approach. Every once in a while, the primary tries an alternative route, and replaces the current route if the alternative provides better replication latency.
Replica pulls messages from the MessageBus, as opposed to the MessageBus pushing messages.
Earlier, replicas had to process every message that the bus pushed. This could lead to messages being dropped due to lack of available disk read/write IOPs. Now, a replica can "suspend" certain messages and return to them later when it has enough IOPs.
CDC support to stream TigerBeetle state to AMQP targets, such as RabbitMQ and other compatible brokers.
We implement the AMQP 0.9.1 specification instead of AMQP 1.0 as it is simpler and more widely supported (e.g., RabbitMQ only recently added native AMQP 1.0 support).
Unify the production and testing AOF code paths to make sure the production AOF is rigorously fuzzed by the VOPR.
Reduce code duplication while erasing IO callbacks' type.
Track debug build times on DevHub.
Miscellaneous improvements and fixes to CI and release.
Fix assert in fulfill_block, if a replica receives a block that it didn't ask for from a newer replica.
Released: 2025-05-23
Fix assert in fulfill_block, if a replica receives a block that it didn't ask for from a newer
replica.
Extract the parsing parts of MessageBus into a sans-IO style ReceiveBuffer, that'll be used for the upcoming pull based MessageBus.
Speed up the LSM scan fuzzer.
Implement request throttling for grid repair, making state sync less chatty over the network.
Released: 2025-05-16
Implement request throttling for grid repair, making state sync less chatty over the network.
Improved latency and throughput in prepare repair operations.
Make the Quick Start page more direct by showing only the installation instructions for Linux by default, with Windows and macOS hidden behind click-to-expand sections.
New tigerbeetle inspect op command that displays checkpoints and triggers surrounding a given
op number.
Decouple prepare repair from header breaks. This helps a replica repair faster, and prevents a case where we would request a prepare only to discard i
Released: 2025-05-09
Fix AOF unflushed assertion.
Decouple prepare repair from header breaks. This helps a replica repair faster, and prevents a case where we would request a prepare only to discard it when it arrives.
Bump default journal write iops. Previously we were inadvertently throttling repair by not allocating enough.
Primary now broadcasts start_view message on checkpoint durability.
This will help syncing replicas update to the latest sync target as early as possible.
Add assert to check return value of next_batch_of_block_requests.
Add subcommand to git-review to send review comments as a email.
Add subcommand to git-review to split suggested code changes out of a review commit.
Speed up fuzz smoke tests.
Improve memory usage of tests 10x and test runtime 10x.
Add arbitrary debug output to CFO seeds.
Fix for multiple CFO branches on same commit.
Reduce closed loop replication quorum from n to n-1.
Heads up, we are changing our release process! From this point on, a TigerBeetle release is tagged on Friday, spends a weekend on the CFO fleet, and i
Released: 2025-05-02
Heads up, we are changing our release process! From this point on, a TigerBeetle release is tagged on Friday, spends a weekend on the CFO fleet, and is published on Monday. In other words, you'll still be getting a new release every Monday, but the date of the release will be set to Friday. This setup allows extra time for fuzzers to find problems in the specific commit we are trying to release.
Continuously fuzz the release branch, in addition to the main branch and the pull requests.
Eagerly deinitialize clients upon eviction, to proactively sever TCP connections to replicas.
Add an initial Rust client. Note that it is not published to crates.io yet.
Reduce verbosity when running full CI suite locally.
Switch to using gpa as backing allocator for clients.
Released: 2025-04-28
Switch to using gpa as backing allocator for clients.
Set socket options for peer connections.
Add tb_client_init_parameters and implement for Python client.
Fix tigerbeetle inspect grid for data files with no used blocks.
CI improvements.
De-genericify Queue.
Modernize stdx.cut API
Trial a git-native + offline-first code review interface.
Devhub improvements. In particular, ensure that a failing canary fuzzer is obvious.
Compile scripts for zig build ci.
Fix a bug where VOPR latencies were computed incorrectly when the minimum and mean were equal.
Released: 2025-04-21
Fix a bug where VOPR latencies were computed incorrectly when the minimum and mean were equal.
Improve binary size and compilation time by making implementation of intrusive stack non-generic.
Make the Docs website pass the W3C HTML validation test.
Fix a memory leak in VOPR and apply idiomatic naming conventions for the allocator.
Fix a panic where the VOPR attempts to print a deinitialized packet when debug logs are enabled.
Fix journal disjoint-buffer assertion.
Released: 2025-04-14
Fix journal disjoint-buffer assertion.
Make object cache optional. This improves throughput by ~10%, as we can omit the object cache from the account events groove, which never uses it.
Please note that after #2787, which adds batching support for all operations, the batch_max limit has changed from 8190 to 8189 accounts/transfers per
Released: 2025-04-07
Please note that after #2787, which adds
batching support for all operations, the batch_max limit has changed from 8190 to 8189
accounts/transfers per batch.
Add support for batching multiple independent requests of the same operation within a single VSR message, amortizing network and consensus costs.
Earlier, we batched only create_accounts and create_transfers. Now, we can batch any operation!
Use TigerBeetle's time abstraction as opposed to raw OS time in the tracer.
Allow custom network packet delay functions in the VOPR. This allows us to simulate latencies for different network topologies, for example the ring/star topology.
Fix a VOPR false positive wherein we were accessing a crashed replica's uninitialized memory.
Improve error thrown when an invalid --account/transfer-batch-size is passed to the benchmark CLI.
Minor refactors to VSR and VOPR.
Fixes and improvements in the documentation.
Add basic fuzzing for the state machine.
Released: 2025-03-31
Add basic fuzzing for the state machine.
Re-do tickless VOPR to simulate fast IOPs.
Allow simulating one-replica-down scenario in the VOPR.
Print dropped packets in the VOPR.
Various changes for VOPR performance mode.
A quicker request protocol for VSR.
Account for pulses when computing the size of the request queue in VSR.
Fix a possible panic in the Node.js client by handling the "too much data" error.
Fix a possible replica crash if negative timestamps would be provided to AccountFilter or QueryFilter.
Allow tigerbeetle inspect to run on open data files. This helps with getting an idea what's
going on a running cluster without needing to shut it down first.
Vendor our own BitSet in stdx, TigerBeetle's extended standard library. This change reduces the Linux binary size by 38KiB.
Track the REPL execution time on DevHub.
Fix the wording in the correcting transfers example. Thanks @shraddha38!
Remove the global allocator from the fuzzers and pass the allocator explicitly to align more with TigerStyle.
Block merges in the CI based on DevHub pipeline results.
Add replica/lsm/grid/journal metrics to VSR.
Note that #2824 bumps the oldest supported client version to 0.16.4, removing backward compatibility with various deprecated features. Please make sur…
Released: 2025-03-24
Note that #2824 bumps the oldest supported client version to 0.16.4, removing backward compatibility with various deprecated features. Please make sure that all of your clients are running on at least 0.16.4 before upgrading to this release!
Add performance mode to the VOPR, which tracks the number and aggregate size of each kind of message during a run.
Bump the oldest supported client version to 0.16.4, removing backward compatibility with various deprecated features.
Simplify the idiom around adding elements to lists with comptime known lengths.
Better styling for links and block quotes in the documentation.
Change debug multiversion builds to encapsulate two versions as opposed to five.
Improve CFO efficacy by retaining Zig build cache across fuzzing iterations.
Update TigerStyle to add a new rule about using long form arguments in scripts (--force over -f).
Fix various VOPR false positives.
Vendor the PRNG, and tweak the API to be less wordy.
Released: 2025-03-17
Vendor the PRNG, and tweak the API to be less wordy.
PRNG algorithms tend to change, often for reasons not applicable to TigerBeetle. We need neither the fastest, nor the most secure PRNG, and it's better if we rotate our PRNG algorithm at our own pace.
Fix a case where, if a busy cluster's pipeline is full, the prepare_timeout was never reset.
This improves performance of a local benchmark for a 6-replica cluster with one replica down and 4 clients almost ~4x.
Add syntax highlighting to docs code snippets (thanks @nilskch!), fix Python example code (thanks @IvoCrnkovic!) and update our HACKING.md with current practices.
Prepare for the Zig 0.14 upgrade by applying as many changes that still work on 0.13 as possible. This includes vendoring AEGIS, to keep hash stability, as 0.14 changes the implementation.
Use LIFO instead of FIFO for free blocks during compaction for better temporal locality.
Released: 2025-03-09
Use LIFO instead of FIFO for free blocks during compaction for better temporal locality.
Disallow converting negative big integers to UInt128 in the Java and Go clients, as they
would be incorrectly interpreted as unsigned big integers when converted back.
Remove spurious write_reply_next() after read completes in client_replies,
as reads and writes can happen concurrently.
Assert that cache_map.stash is not using any element beyond its defined capacity.
#2791, #2792, #2793, #2794, #2795, #2796, #2807
Miscellaneous documentation typo fixes, clarifications, and references.
Ban qualified std.debug.assert and @memcpy.
Fix code comment typos.
Add tracking of format time and startup time to the devhub.
Note: Before performing this upgrade, please make sure to check that no replicas are lagging and state syncing.
Released: 2025-03-03
Note: Before performing this upgrade, please make sure to check that no replicas are lagging and state syncing.
You can ensure this by temporarily pausing load to the TigerBeetle cluster and waiting for all
replicas to catch up. If some replicas in your cluster were indeed lagging, you should see
on_repair_sync_timeout: request sync; lagging behind cluster in the logs, followed by
sync: ops=, which indicates the end of state sync. If you don't see the former in the logs, then
you are already safe to upgrade!
This is to work around an issue in the upgrade between 0.16.25 → 0.16.26, wherein a state syncing replica goes into a crash loop when it upgrades to 0.16.26. If one of your replicas has already hit this crash loop, please reach out to us on the Community Slack so we can help you safely revive it.
Fix TOCTOU bug in our hybrid set-associative cache and hash map structure, wherein a promotion to the cache coupled with an eviction from the cache could lead to invalid pointer references.
Add logic to crash replica upon receiving unknown commands from clients and other replicas.
Fix upgrade bug wherein a replica does not detect a change in the binary if it is replaced during
its initialization in Replica.open().
Alternate replication direction for even and odd ops to better detect breaks in the ring topology.
#2770, #2781, #2779, #2778, #2769,
Add new docs content to TigerBeetle Architecture, fix miscellaneous typos and references.
Simplify idiom around a replica sending messages to itself.
Refactor MessageBus to remove platform-specific IO logic.
Explicitly ignore deprecated protocol messages.
Released: 2025-02-24
Note: Before performing this upgrade, please make sure to check that no replicas are lagging and state syncing.
You can ensure this by temporarily pausing load to the TigerBeetle cluster and waiting for all
replicas to catch up. If some replicas in your cluster were indeed lagging, you should see
on_repair_sync_timeout: request sync; lagging behind cluster in the logs, followed by
sync: ops=, which indicates the end of state sync. If you don't see the former in the logs, then
you are already safe to upgrade!
This is to work around an issue in the upgrade between 0.16.25 → 0.16.26, wherein a state syncing replica goes into a crash loop when it upgrades to 0.16.26. If one of your replicas has already hit this crash loop, please reach out to us on the Community Slack so we can help you safely revive it.
Explicitly ignore deprecated protocol messages.
Fix a crash when, during upgrade, replica's binary is changed the second time.
Implement metrics, using statsd format.
Add new indexes to the account balances to enable CDC.
#2521, #2751, #2756, #2757, #2754
Restructure documentation.
Implement more standard shortcuts for REPL.
Refactor C client API to remove internal mutex.
Don't use deprecated Node.js APIs in the samples.
Improve documentation search.
Switch to vale for documentation spell checking.
Your coding agent can read these notes before it upgrades. Set up the MCP server →