All notable changes to binpatch are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Real-repo upgrade — Craft release, Astro docs site, polished README by @BYK in #6
- Link-check downloads dist/ artifact from build job by @BYK in #28
- Untitaker/hyperlink tags use no
vprefix by @BYK in #26 - Switch link-check from broken python -m hyperlink to untitaker/hyperlink action by @BYK in #25
- Run test+pack on release/* branches; add CHANGELOG.md by @BYK in #15
- Revert enablement:true (App lacks Pages-create permission) by @BYK in #9
- Auto-enable GitHub Pages via the API by @BYK in #8
- Fix flow.svg crop + add dark-mode styles by @BYK in #33
- Convert broken .// refs to root-relative // by @BYK in #31
- SVG for the home-page flow diagram; reword Bun/mmap rationale by @BYK in #18
- Correct API mismatches across all 15 docs pages by @BYK in #7
- (apply) Close output fd synchronously to avoid ETXTBSY on subsequent spawn by @BYK in #37
- (publish) Rewrite to Craft-driven publish on accepted label by @BYK in #12
- Rebrand homepage around 'any binary' + raw .md endpoint by @BYK in #36
- Cleaner home-page flow SVG; name bundlers in When to use by @BYK in #23
- Add favicon (SVG + 32 PNG + 180 apple-touch) by @BYK in #21
- Rebrand — tell the BinPatch story, drop the Craft clone look by @BYK in #17
- (home) Name the binaries we update (Bun, Deno, SEA, yao-pkg, esbuild, fossilize) by @BYK in #20
- (readme) Point docs link at custom domain by @BYK in #22
- Link-check warning-only — Starlight pagination floods report by @BYK in #29
- Add hyperlink link-check job by @BYK in #24
- (craft) Add github target so releases cut a GH release alongside npm by @BYK in #38
- (deps) Bump the npm_and_yarn group across 1 directory with 3 updates by @dependabot in #11
applyReaderToFilenow closes the output fd synchronously. Previously, the function usedfs.createWriteStreamand awaitedwriter.end(). Node resolves theendcallback on the'finish'event (data flushed) but the underlying fd can still be held at the kernel level after the callback fires. On Linux, a subsequentspawn(which callsexecve) of the output file then intermittently fails withETXTBSY("text file busy") — thefs.writeFilepattern closes the fd synchronously before returning, which is why the bug only surfaced in environments where full-download fallback tostreamDecompressToFilechained immediately into a spawn. Replaced withfs.openSync+fs.writeSync+fs.closeSync. See the Security → /security/#output-fd-release page for the new guarantee.
- Clarified that the OCI patch manifest's
from-versionannotation is a chain pointer, not a content hash.applyPatchChainInMemoryverifies only the final output SHA; it cannot detect a publish-pipeline bug where the annotation claims one source but the patch bytes were generated from a different source. The publish pipeline MUST guarantee the annotation matches the actual patch source — recomputingPREV_TAGindependently in two CI jobs (e.g. a generate job and a publish job) is a bug. See Security → /security/#from-version-annotation-trust. - Documented the synchronous output-fd release guarantee so consumers
know they can
spawnthe apply output without racing ETXTBSY. - Reposition homepage to lead with "any binary" framing (Electron apps, CLIs, agents, game updaters) instead of CLI-only. Hero now features a measured download comparison chart for getsentry/cli 0.29.0 → 0.39.0 (8 adjacent release pairs, sentry-linux-x64). The typical (median) patch is 4.0% the size of the full gzipped binary — 1.32 MB vs 31.38 MB, 96% saved per update. Range across the 8 pairs: 0.9% (small fixes) to 8.1% (big features).
- Add "View as Markdown" link in the page footer. Each page now exposes its
raw markdown source at
/<slug>.md— implemented via a Starlight component override and an Astro API endpoint, both base-path aware so PR previews keep working.
- Guard chain discovery against malformed/incomparable version tags (no longer throws when a nightly patch tag has an unparseable semver).
- Add
InstrumentHookso consumers can wrap every HTTP call (for telemetry / tracing) without losing per-request granularity. - Bump to minor (additive) — no breaking changes.
- Add injectable
fetchtoOciClient/ghcrSourceso consumers can supply a custom fetch implementation (custom CA / proxy / test injection). - Bump to minor (additive) — no breaking changes.
- Initial release: reusable binary delta-update engine.
bspatchcore (BSDIFF-style patch application, memory + streaming).- Chain discovery from GHCR (nightly) and GitHub Releases (stable).
- Patch cache with SHA-256 verification.
- Composite GitHub Action (
packages/binpatch/action) for delta-patch generate + publish.