Repository navigation
Release v4.0.0
caxa 4.0 rewrites the runtime stub in Rust and is built for large applications, such as the full cdxgen binary with its native plugins. The stub is about 0.5 MB instead of 3 MB, and all seven targets are cross-compiled from one host.
Payloads are now compressed and extracted in parallel frames (payload format v2). For cdxgen on macOS arm64, the build went from 187 s to 50 s and the cold start from 1.4 s to 0.8 s, for under 1% of binary size. Payload bytes stay identical across repeat builds and core counts.
Large executables that most runs never start can be extracted on first use with --lazy or --lazy-auto, and on Unix a low-priority background prefetcher fills them in after the app starts. With cdxgen's plugins lazy, a cold start writes 187 MB instead of 610 MB. Large files decode straight into place, so neither the stub nor the prefetcher needs more than a few megabytes of memory for them, and files over 32 MiB decode on several threads. The bundled Node runtime is now stripped of its symbol table, which saves about 2.5 MB per binary and 18 to 24 MB of writes on every cold start.
Most builds upgrade without changes. Native zstd outputs default to the v2 format, so only tools that parse caxa binaries themselves, or custom stubs from 3.x, need --payload-format v1. A 4.0 build extracts into a new cache directory, and caxa does not remove the old ones. Stripping Node needs strip on Linux and strip plus codesign on macOS; without them caxa warns and bundles Node as it is, and --no-strip-node turns stripping off. The README's "Upgrading from 3.x" section has the full list, and docs/performance.md has the measurements, including the ideas we tried and dropped. Contributors now need Rust, zig and cargo-zigbuild instead of Go.
This release collects #12 (Rust stub), #14 (parallel payload), #15 and #16 (lazy members, prefetch and in-place decode), #17 (stripped Node and parallel parts) and #18 (docs, and fixes to --upx-args and the API types).
Full Changelog: v3.1.1...v4.0.0