Skip to content

Releases: Bzoink/boltpack

BoltPack v1.5

Choose a tag to compare

@Bzoink Bzoink released this 30 Aug 18:57

BoltPack Release Notes

v1.5.0 — August 2026

Version: 1.5
Status: Stable

License and dependency change

  • Relicensed from GPLv2 to the BSD 2-Clause "Simplified" License. BoltPack
    code is now BSD-2-Clause; bundled third-party components retain their own
    license notices.
  • miniLZO 2.10 (GPLv2) removed and replaced by fastlz 0.5.0 (MIT).
    fastlz is vendored in lib/fastlz/ (C89-ported) with its MIT license notice
    preserved.
  • Method ID 2 now means fastlz. Archives created by pre-1.5.0 builds using
    method 2 (LZO1X) are not compatible and will not decode. There are no
    external users yet, so no backward-compatibility shim is provided. The on-disk
    archive format version is unchanged (BP_FORMAT_VERSION stays 3).

What's new

  • fastlz replaces LZO1X as the default fast general-purpose codec (the
    -2 / --fastlz flag; the long flag --minilzo is renamed --fastlz).
  • fastlz level selector: -l 1 forces fastlz level 1 (8 KB window),
    -l 2 forces level 2 (64 KB window), and omitting -l lets fastlz
    auto-select level 1 below 64 KB and level 2 at or above it. Levels 3–9
    clamp to level 2.
  • 16-bit behavior: fastlz decompression is supported on 16-bit builds via
    the clean-room src/core/mini/fastlz_decomp.c decoder; fastlz compression
    is not (its 8192-entry stack hash table is too large for 8086-class stacks),
    the same treatment LZO1X had on 16-bit.
  • creator_ver in new archives: 0x01, 0x05.
  • Mini build (bpmini) bumped to 1.3.

v1.4 — July 2026

Version: 1.4
Status: Stable

Archive format

Format version bumped to 3. v3 archives are not readable by BoltPack 1.3
or earlier. v3 readers cannot read v2 archives (strict version check). The
creator_ver bytes in archives written by BoltPack 1.4 are 0x01, 0x04.

What's new

Archive format v3

  • Per-block CRC-32 — every compressed block now carries a 4-byte CRC-32
    field. The block header grows from 8 to 12 bytes (comp_size + orig_size + block_crc). Readers verify the CRC before decompressing; a mismatch is
    reported as BP_ERR_CHECKSUM. This makes corruption detectable at the
    earliest possible point in the read path rather than only at the whole-entry
    checksum.
  • total_orig in file-table header — the 8-byte table header grows to 16
    bytes by appending the sum of all original_size values. Listing and info
    commands read total uncompressed size directly from the table header without
    scanning every entry record.
  • Unix permission bits in entry flags — the entry flags field (previously
    reserved) now carries bit 15 (BP_ENTRY_FLAG_MODE_VALID) and bits 0–11
    (BP_ENTRY_FLAG_MODE_MASK) for the 12-bit Unix permission field
    (st_mode & 0x0FFF). On the Linux frontend, permissions are stored at create
    time and restored with chmod at extract time. Unknown flag bits are accepted
    silently for forward compatibility. New bp_archive_add_entry_ex and
    bp_archive_pack_entry_ex API variants let frontends set flags without
    modifying existing call sites.
  • archive_size is now normative for v3 — a v3 reader must verify that the
    stored archive_size matches the actual file size; mismatch → BP_ERR_TRUNCATED.
    Writers must store the correct total file size. (v2: informational only.)

CRC-32 as the only checksum

Adler-32 (checksum_type = 0) is fully retired. Writers have not emitted it
since v1.2, and v3 now makes checksum_type = 1 (CRC-32) mandatory. Readers
encountering checksum_type != 1 on a v3 archive return BP_ERR_CORRUPT.
The BP_ENABLE_ADLER32 build flag is retained for unit-testing the function
itself.

zstd multi-threaded compression

The Linux CLI and Linux/Windows FLTK GUI frontends now run zstd compression
with multiple threads when -j N is given alongside -Z. The sequential
path is unchanged. No archive-format impact.

Mini build (bpmini 1.2)

  • Lazy allocation of the LZSS work buffer (16-bit path, 29 200 bytes) and
    LZO work buffer (32-bit path, 64 KB): memory is malloc'd on the first
    create call and cached for process lifetime. Extract, list, test, and info
    operations no longer pay for compression scratch at startup.
  • Per-entry extract buffers hoisted to once-per-run: two malloc/free pairs per
    run instead of two per entry, eliminating far-heap churn on DOS.
  • DOS-16 and Win16 frontends: full list, info, test, extract, create, append,
    and delete command set aligned with the full build's CLI conventions.
  • Watcom builds: -zm flag added for function-level segments so option eliminate can strip dead functions. linuxmini binary stripped of unwind
    tables, symbol tables, and build-id.

Correctness and internal quality

  • Append bug fix — an off-by-one in bp_archive_open_append caused the
    last byte of the old file table to be included in the first new data block,
    corrupting archives created via append on v2 archives with certain table
    alignments.
  • Codec reentrancy — Fluff, zstd, and miniLZO compression contexts are now
    fully allocated per-call; no static state remains in the codec layer, making
    the core safe for process-level concurrent use (one archive per thread).
  • Security fixes — path traversal checks tightened; symlink target
    validation added (bp_symlink_target_is_safe); integer overflow guards added
    to block-size arithmetic in the decompression path.
  • Layering cleanup — archiver internal helpers moved out of archiver.h
    into a private header; public surface area of bp_archive_t reduced.
  • zstd error strings moved out of the vendored lib/zstd/zstd.c into the
    wrapper (zstd_wrap.c) so the vendored file tracks upstream cleanly.
  • stderr fallback removed from core — the archiver core no longer writes to
    stderr directly; all diagnostics go through the bp_log_fn callback.
    Frontends that do not set a log callback silently discard diagnostic messages.

Codec table

Method Name Intended use
0 Stored Incompressible data or raw fallback
1 LZSS Small-memory and 16-bit compatible compression
2 fastlz Fast general-purpose compression; current default
3 Fluff High compression ratio; all full-build targets
4 zstd Best compression ratio; modern 32/64-bit targets only

v1.3 — July 2026

Version: 1.3
Status: Stable

What's new

  • LAN send/receive — transfer archives directly between machines on the
    local network without a shared filesystem or external service.
    • boltpack listen starts a receiver; boltpack scan lists active receivers.
    • --send HOST streams a newly created archive to a named or IP-addressed
      receiver immediately after the create step.
    • Discovery uses UDP broadcast so receivers are found by friendly name; no
      manual IP entry required on typical home/office networks.
    • Broadcast is sent on every network interface, fixing discovery when a
      multi-homed host or VPN adapter is present.
  • Receiver options:
    • --name NAME — advertise a friendly name (listen) or identify the sender
      (send); defaults to the system hostname.
    • --auto / --prompt — accept all incoming transfers silently, or prompt
      before each one (default: prompt).
    • --autoextract — unpack the received archive into files immediately rather
      than saving the .bolt file.
    • --autoverify — re-read and verify the saved .bolt from disk after
      download completes.
    • --timeout N — scan wait time in seconds (default: 2).
    • -o PATH — save received archives (or extracted files) to a specific
      directory; the directory is created automatically if it does not exist.
  • GUI integration (FLTK frontends, Linux and Windows):
    • Create dialog gains a Send over network action alongside the existing
      Save action; choosing it opens a receiver picker populated by a live
      LAN scan.
    • The receiver picker shows each host's friendly name, IP address, and
      accept mode.
  • Platform coverage — LAN networking is enabled on all 32-bit and 64-bit
    targets that have a POSIX socket layer or WinSock2: Linux (x86-64, ARM,
    ARM64, RISC-V), musl static, macOS, Haiku, FreeBSD, NetBSD, illumos, GNU
    Hurd, Windows (CLI and FLTK GUI), and all tier-3/tier-4 cross targets.
    16-bit and bare-metal targets are not affected.
  • Bug fixboltpack listen -o DIR in save mode (no --autoextract) now
    creates the output directory if it does not already exist, rather than
    failing silently and discarding the received archive.

Archive format

Format version remains 2 (no archive-format changes in this release). The
creator_ver bytes in archives written by BoltPack 1.3 are 0x01, 0x03.

Codec table

Method Name Intended use
0 Stored Incompressible data or raw fallback
1 LZSS Small-memory and 16-bit compatible compression
2 miniLZO Fast general-purpose compression; current default
3 Fluff High compression ratio; all full-build targets
4 zstd Best compression ratio; modern 32/64-bit targets only

v1.2 — June 2026

Version: 1.2
Status: Stable

Changes

  • Archive format version 2BP_FORMAT_VERSION bumped from 1 to 2. All
    version checks are now strict equality: archives from v1.0 and v1.1 are
    rejected with BP_ERR_VERSION, and v1.2 archives are rejected by older
    readers. No backward-compatibility layer.
  • Improved LZSS codec (method 1):
    • Sliding window expanded from 2 048 to 4 096 bytes, improving compression
      ratio on...
Read more

BoltPack v1.4

Choose a tag to compare

@Bzoink Bzoink released this 07 Jul 22:50

BoltPack Release Notes

v1.4 — July 2026

Version: 1.4
Status: Stable

Archive format

Format version bumped to 3. v3 archives are not readable by BoltPack 1.3
or earlier. v3 readers cannot read v2 archives (strict version check). The
creator_ver bytes in archives written by BoltPack 1.4 are 0x01, 0x04.

What's new

Archive format v3

  • Per-block CRC-32 — every compressed block now carries a 4-byte CRC-32
    field. The block header grows from 8 to 12 bytes (comp_size + orig_size + block_crc). Readers verify the CRC before decompressing; a mismatch is
    reported as BP_ERR_CHECKSUM. This makes corruption detectable at the
    earliest possible point in the read path rather than only at the whole-entry
    checksum.
  • total_orig in file-table header — the 8-byte table header grows to 16
    bytes by appending the sum of all original_size values. Listing and info
    commands read total uncompressed size directly from the table header without
    scanning every entry record.
  • Unix permission bits in entry flags — the entry flags field (previously
    reserved) now carries bit 15 (BP_ENTRY_FLAG_MODE_VALID) and bits 0–11
    (BP_ENTRY_FLAG_MODE_MASK) for the 12-bit Unix permission field
    (st_mode & 0x0FFF). On the Linux frontend, permissions are stored at create
    time and restored with chmod at extract time. Unknown flag bits are accepted
    silently for forward compatibility. New bp_archive_add_entry_ex and
    bp_archive_pack_entry_ex API variants let frontends set flags without
    modifying existing call sites.
  • archive_size is now normative for v3 — a v3 reader must verify that the
    stored archive_size matches the actual file size; mismatch → BP_ERR_TRUNCATED.
    Writers must store the correct total file size. (v2: informational only.)

CRC-32 as the only checksum

Adler-32 (checksum_type = 0) is fully retired. Writers have not emitted it
since v1.2, and v3 now makes checksum_type = 1 (CRC-32) mandatory. Readers
encountering checksum_type != 1 on a v3 archive return BP_ERR_CORRUPT.
The BP_ENABLE_ADLER32 build flag is retained for unit-testing the function
itself.

zstd multi-threaded compression

The Linux CLI and Linux/Windows FLTK GUI frontends now run zstd compression
with multiple threads when -j N is given alongside -Z. The sequential
path is unchanged. No archive-format impact.

Mini build (bpmini 1.2)

  • Lazy allocation of the LZSS work buffer (16-bit path, 29 200 bytes) and
    LZO work buffer (32-bit path, 64 KB): memory is malloc'd on the first
    create call and cached for process lifetime. Extract, list, test, and info
    operations no longer pay for compression scratch at startup.
  • Per-entry extract buffers hoisted to once-per-run: two malloc/free pairs per
    run instead of two per entry, eliminating far-heap churn on DOS.
  • DOS-16 and Win16 frontends: full list, info, test, extract, create, append,
    and delete command set aligned with the full build's CLI conventions.
  • Watcom builds: -zm flag added for function-level segments so option eliminate can strip dead functions. linuxmini binary stripped of unwind
    tables, symbol tables, and build-id.

Correctness and internal quality

  • Append bug fix — an off-by-one in bp_archive_open_append caused the
    last byte of the old file table to be included in the first new data block,
    corrupting archives created via append on v2 archives with certain table
    alignments.
  • Codec reentrancy — Fluff, zstd, and miniLZO compression contexts are now
    fully allocated per-call; no static state remains in the codec layer, making
    the core safe for process-level concurrent use (one archive per thread).
  • Security fixes — path traversal checks tightened; symlink target
    validation added (bp_symlink_target_is_safe); integer overflow guards added
    to block-size arithmetic in the decompression path.
  • Layering cleanup — archiver internal helpers moved out of archiver.h
    into a private header; public surface area of bp_archive_t reduced.
  • zstd error strings moved out of the vendored lib/zstd/zstd.c into the
    wrapper (zstd_wrap.c) so the vendored file tracks upstream cleanly.
  • stderr fallback removed from core — the archiver core no longer writes to
    stderr directly; all diagnostics go through the bp_log_fn callback.
    Frontends that do not set a log callback silently discard diagnostic messages.

Codec table

Method Name Intended use
0 Stored Incompressible data or raw fallback
1 LZSS Small-memory and 16-bit compatible compression
2 miniLZO Fast general-purpose compression; current default
3 Fluff High compression ratio; all full-build targets
4 zstd Best compression ratio; modern 32/64-bit targets only

v1.3 — July 2026

Version: 1.3
Status: Stable

What's new

  • LAN send/receive — transfer archives directly between machines on the
    local network without a shared filesystem or external service.
    • boltpack listen starts a receiver; boltpack scan lists active receivers.
    • --send HOST streams a newly created archive to a named or IP-addressed
      receiver immediately after the create step.
    • Discovery uses UDP broadcast so receivers are found by friendly name; no
      manual IP entry required on typical home/office networks.
    • Broadcast is sent on every network interface, fixing discovery when a
      multi-homed host or VPN adapter is present.
  • Receiver options:
    • --name NAME — advertise a friendly name (listen) or identify the sender
      (send); defaults to the system hostname.
    • --auto / --prompt — accept all incoming transfers silently, or prompt
      before each one (default: prompt).
    • --autoextract — unpack the received archive into files immediately rather
      than saving the .bolt file.
    • --autoverify — re-read and verify the saved .bolt from disk after
      download completes.
    • --timeout N — scan wait time in seconds (default: 2).
    • -o PATH — save received archives (or extracted files) to a specific
      directory; the directory is created automatically if it does not exist.
  • GUI integration (FLTK frontends, Linux and Windows):
    • Create dialog gains a Send over network action alongside the existing
      Save action; choosing it opens a receiver picker populated by a live
      LAN scan.
    • The receiver picker shows each host's friendly name, IP address, and
      accept mode.
  • Platform coverage — LAN networking is enabled on all 32-bit and 64-bit
    targets that have a POSIX socket layer or WinSock2: Linux (x86-64, ARM,
    ARM64, RISC-V), musl static, macOS, Haiku, FreeBSD, NetBSD, illumos, GNU
    Hurd, Windows (CLI and FLTK GUI), and all tier-3/tier-4 cross targets.
    16-bit and bare-metal targets are not affected.
  • Bug fixboltpack listen -o DIR in save mode (no --autoextract) now
    creates the output directory if it does not already exist, rather than
    failing silently and discarding the received archive.

Archive format

Format version remains 2 (no archive-format changes in this release). The
creator_ver bytes in archives written by BoltPack 1.3 are 0x01, 0x03.

Codec table

Method Name Intended use
0 Stored Incompressible data or raw fallback
1 LZSS Small-memory and 16-bit compatible compression
2 miniLZO Fast general-purpose compression; current default
3 Fluff High compression ratio; all full-build targets
4 zstd Best compression ratio; modern 32/64-bit targets only

v1.2 — June 2026

Version: 1.2
Status: Stable

Changes

  • Archive format version 2BP_FORMAT_VERSION bumped from 1 to 2. All
    version checks are now strict equality: archives from v1.0 and v1.1 are
    rejected with BP_ERR_VERSION, and v1.2 archives are rejected by older
    readers. No backward-compatibility layer.
  • Improved LZSS codec (method 1):
    • Sliding window expanded from 2 048 to 4 096 bytes, improving compression
      ratio on most real-world files.
    • Back-distance encoding replaces the old absolute ring-buffer position.
      The decoder now reads matches directly from the output buffer; the scratch
      buffer for decompression is eliminated entirely (was 2 KB minimum).
    • Token format is now a 12+4 bit back-distance/length split (was 11+5
      absolute-position/length). Back-distance range 1–4 096, match length 3–18.
    • Lazy matching and BST-based encoder retained; encoder scratch grows from
      14 900 to 29 200 bytes (fits comfortably in the 16-bit far data segment).
  • Mini build (bpmini) version bumped to 1.1. Shares the improved LZSS
    codec; decoder scratch eliminated on 16-bit targets as well.
  • Archive format version is now 2; creator_ver in new archives: 0x01, 0x02.

Codec table

Method Name Intended use
0 Stored Incompressible data or raw fallback
1 LZSS Small-memory and 16-bit compatible compression
2 miniLZO Fast general-purpose compression; current default
3 Fluff High compression ratio; all full-build targets
4 zstd Best compression ratio; modern 32/64-bit targets only

v1.1 — June 2026

Version: 1.1
Status: Stable

What's new

  • Method 4: zstd (Zstandard) — best compression ratio in BoltPack, enabled
    by default on all mode...
Read more