Version 0.2.0 (2026-04-21)
    * `use_alt_rep` parameter temporarily disabled with warning for this version
    * Add stored `xxhash` checks and warn on mismatch by default
    * Replace the old custom unwind-jump handling with `Rcpp::unwindProtect()` and extend the same cleanup model to qdata read/write paths
    * Add `R_CheckStack()` to qdata recursive read/write paths so deep nesting fails cleanly instead of crashing
    * Harden malformed-input handling in `qs2`, `qdata`, `qx_dump()`, and `qs_to_rds()`: reject oversized compressed-block headers, oversized qdata lengths, short malformed blocks, and attribute counts, malformed attribute names and semantically invalid R attributes
    * Add max output size parameter in `zstd_decompress_file()` and `zstd_in()`, and delete partial output on failure
    * Make `qs_save()` and `qd_save()` fail cleanly if file writes start successfully but later fail (e.g. due to full disk)
    * Require actual raw vectors in `zstd_(de)compress_raw()`, `blosc_(un)shuffle_raw()`, and `xxhash_raw()` instead of allowing implicit coercion
    * Harden `base85` / `base91` utilities and expand utility regression coverage for malformed and empty inputs
    * Fix qdata delayed attribute replay ordering for malformed or canonicalized attribute subtrees
    * Remove the old dynamic-blocksize plumbing and keep the fixed block-size path only
    * Update bundled zstd from `1.5.6` to `1.5.7` and vendored qdata-cpp xxHash from `0.8.2` to `0.8.3`
    * Add reproducible local vendoring helpers for bundled zstd and vendored xxHash
    * Add deterministic malformed-input regressions and expand fuzz coverage in local hardening scripts
    * Refactor qdata internals into a vendored standalone `qdata-cpp` package
    * Fix usage of `Rf_error` error handling (https://github.com/qsbase/qs2/issues/26)
    * Fix performance bug, use correct shuffle flag at high compress levels

Version 0.1.7 (2026-01-18)
    * Replace `ATTRIB` and `SET_ATTRIB` calls (no longer in API)
    * Enable TBB by default (via RcppParallel); use configure --without-TBB to force disable
    * Add ZSTD file substitution helpers `zstd_in` and `zstd_out`
    * Add ZSTD bindings section to the vignette

Version 0.1.6 (2025-11-20)
    * If `nthreads > 1` requested and TBB not available, fall back to `nthreads = 1` and produces a warning instead of an error
    * Minor fix: for complex vectors with attributes header was written twice in `qd_save`
    * Minor fix: for non-UTF8 environments and non-ascii strings and using `stringfish` ALTREP, `qd_save` was not correctly translating to UTF8
    * Add zstd file utilities `zstd_compress_file` and `zstd_decompress_file`
    * Add `tests/utility_testing.R` to test additional utility functions
    * Update qdata deserializer to set class attributes without deprecated `SET_OBJECT` function

Version 0.1.5 (2025-03-07)
    * Fix `_u8` literal operator to align with C++23 (-Wdeprecated-literal-operator)
    * Add global parameters for serialization arguments, see `Global Options for qs2` in the README / vignette

Version 0.1.4 (2024-12-12)
    * Fix for decompression error edge case (https://github.com/qsbase/qs2/issues/7)

Version 0.1.3 (2024-12-02)
    * Add additional `PROTECT` and `UNPROTECT` calls to remove false positive RCHK warnings

Version 0.1.2 (2024-11-24)
    * Add support for newer versions of TBB using tbb::flow::input_node (https://github.com/qsbase/qs2/issues/2)
    * Add in memory serialization functions `qs_serialize`, `qs_deserialize`, `qd_serialize` and `qd_deserialize`
    * Add `qs_readm` and `qs_savem` functions for saving and loading multiple objects
    * Added XXH3 64 bit standalone function `xxhash_raw`
    * Ported from `qs` package: star name database from the International Astronomical Union; see `?starnames`
    * Ported from `qs` package: base85 and basE91 ASCII encoding

Version 0.1.1 (2024-09-16)
    * Initial CRAN release
