Releases: Bzoink/boltpack
Release list
BoltPack v1.5
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 inlib/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_VERSIONstays 3).
What's new
- fastlz replaces LZO1X as the default fast general-purpose codec (the
-2/--fastlzflag; the long flag--minilzois renamed--fastlz). - fastlz level selector:
-l 1forces fastlz level 1 (8 KB window),
-l 2forces level 2 (64 KB window), and omitting-llets 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-roomsrc/core/mini/fastlz_decomp.cdecoder; 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_verin 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 asBP_ERR_CHECKSUM. This makes corruption detectable at the
earliest possible point in the read path rather than only at the whole-entry
checksum. total_origin file-table header — the 8-byte table header grows to 16
bytes by appending the sum of alloriginal_sizevalues. 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
flagsfield (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 withchmodat extract time. Unknown flag bits are accepted
silently for forward compatibility. Newbp_archive_add_entry_exand
bp_archive_pack_entry_exAPI variants let frontends set flags without
modifying existing call sites. archive_sizeis now normative for v3 — a v3 reader must verify that the
storedarchive_sizematches 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:
-zmflag added for function-level segments sooption eliminatecan 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_appendcaused 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 ofbp_archive_treduced. - zstd error strings moved out of the vendored
lib/zstd/zstd.cinto the
wrapper (zstd_wrap.c) so the vendored file tracks upstream cleanly. - stderr fallback removed from core — the archiver core no longer writes to
stderrdirectly; all diagnostics go through thebp_log_fncallback.
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 listenstarts a receiver;boltpack scanlists active receivers.--send HOSTstreams 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.boltfile.--autoverify— re-read and verify the saved.boltfrom 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.
- Create dialog gains a Send over network action alongside the existing
- 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 fix —
boltpack listen -o DIRin 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 2 —
BP_FORMAT_VERSIONbumped from 1 to 2. All
version checks are now strict equality: archives from v1.0 and v1.1 are
rejected withBP_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...
- Sliding window expanded from 2 048 to 4 096 bytes, improving compression
BoltPack v1.4
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 asBP_ERR_CHECKSUM. This makes corruption detectable at the
earliest possible point in the read path rather than only at the whole-entry
checksum. total_origin file-table header — the 8-byte table header grows to 16
bytes by appending the sum of alloriginal_sizevalues. 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
flagsfield (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 withchmodat extract time. Unknown flag bits are accepted
silently for forward compatibility. Newbp_archive_add_entry_exand
bp_archive_pack_entry_exAPI variants let frontends set flags without
modifying existing call sites. archive_sizeis now normative for v3 — a v3 reader must verify that the
storedarchive_sizematches 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:
-zmflag added for function-level segments sooption eliminatecan 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_appendcaused 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 ofbp_archive_treduced. - zstd error strings moved out of the vendored
lib/zstd/zstd.cinto the
wrapper (zstd_wrap.c) so the vendored file tracks upstream cleanly. - stderr fallback removed from core — the archiver core no longer writes to
stderrdirectly; all diagnostics go through thebp_log_fncallback.
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 listenstarts a receiver;boltpack scanlists active receivers.--send HOSTstreams 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.boltfile.--autoverify— re-read and verify the saved.boltfrom 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.
- Create dialog gains a Send over network action alongside the existing
- 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 fix —
boltpack listen -o DIRin 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 2 —
BP_FORMAT_VERSIONbumped from 1 to 2. All
version checks are now strict equality: archives from v1.0 and v1.1 are
rejected withBP_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).
- Sliding window expanded from 2 048 to 4 096 bytes, improving compression
- 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_verin 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...