Zipp releases
Zipp publishes GitHub Releases only. Since v0.0.26 they are plain files: the native CLI for Windows x86-64, as a portable .exe and an .msi installer, and for Linux x86-64, arm64 and armv7, one .wasm file per WebAssembly engine (each also Brotli-compressed, as .wasm.br), and an embed kit; up to v0.0.25 they were x86-64 CLI archives for Windows and Linux and WebAssembly archives. Twenty-nine tags shipped between 30 August and 23 October 2026. This page lists them, explains what a release has to pass, and links the notes.
Latest: v0.0.29, 23 October 2026
An embedded script's error positions are its own and a syntax error says where it is, a sandbox's host requests are bounded and cancellable, and a permitted redirect is checked before it is followed. A large script keeps one copy of its source, and zipp js keeps its compiled code between runs: TypeScript's peak working set falls from 349 to 310 MiB, and run again its workload finishes in 0.83 s instead of 1.14 s. The benchmarks page shows v0.0.28's profile-guided capture; the release notes give this release's measurements.
- Embedding: lines and columns count from the host's own text (in the browser engine an app's line N had read N+154);
setScriptOrigin(name, lineOffset, columnOffset)names a script and moves its positions as Node'svm.Scriptoptions do, the preamble's own frames readzipp:preamble, and a syntax error gives its position. Natively,embed::ScriptOrigindoes the same. - Sandbox: with
permissions.network.redirects: true, each redirect's destination is checked against the allowlist before it is requested (an origin the allowlist does not name had received the request first); host requests run at most 64 at once, each with anAbortSignal, andclose()settles every run still waiting on one. Loader 1.3.0, host SDK 1.4.0. - Fixes: a class evaluated more than once resolves
superand its own name against its own evaluation; a heap ceiling no longer convicts a script on garbage a major collection would free, or on slot tables doubled to hold it (both in v0.0.28 as well); Python's/on two ints rounds once, as CPython's does,inon two ASCII strings takes linear time, andinon arangeorbytesfollows CPython;TextDecoderkeeps its stream state. - Interpreter: inherited reads, private fields and
x == nullare faster, and the 78 benchmark programs take 0.99× v0.0.28's time interpreted and 0.98× with the JIT.zipp jskeeps the compiled code of a script of 32 KiB or more in the per-user cache folder;ZIPP_CACHE_DIR=set to empty turns that off. - WebAssembly size: as published, the JavaScript engine is 1.24 MB on the wire, ZIPP Lite 0.75 MB, Python without torch 1.63 MB and the complete engine 2.01 MB; the torch package 0.40 MB. The engines are 0.2% to 0.5% larger on the wire than v0.0.28's.
| Asset | Bytes | Contents |
|---|---|---|
zipp-0.0.29-windows-x86_64-portable.exe | 17,854,976 | Native CLI for Windows x86-64, complete: JavaScript with the x86-64 JIT, Python with its JIT tier, torch and the native GPU path; runs from anywhere |
zipp-0.0.29-windows-x86_64-installer.msi | 5,799,936 | The same CLI as a per-user install into %LOCALAPPDATA%\Programs\ZIPP that adds zipp to the user's PATH; no administrator rights |
zipp-0.0.29-linux-x86_64 | 19,523,616 | Native CLI for Linux x86-64, same contents; glibc 2.35 or later, chmod +x after downloading |
zipp-0.0.29-linux-arm64 | 16,153,304 | Native CLI for 64-bit Arm Linux |
zipp-0.0.29-linux-armv7 | 16,985,864 | Native CLI for 32-bit Arm Linux with hard float, interpreter only |
zipp-0.0.29-javascript.wasm | 4,838,214 | JavaScript engine, with Intl and Temporal, for pages, Workers, Node, Deno and Bun |
zipp-0.0.29-javascript-lite.wasm | 2,760,194 | ZIPP Lite: the JavaScript core without Intl and Temporal, built for size |
zipp-0.0.29-javascript-python.wasm | 8,608,417 | JavaScript + Python with torch built in |
zipp-0.0.29-javascript-python-base.wasm | 6,569,310 | JavaScript + Python without torch |
zipp-0.0.29-torch-package.wasm | 2,163,109 | The torch package, added to the -javascript-python-base engine when a program needs it |
zipp-0.0.29-javascript.wasm.br | 1,237,645 | The JavaScript engine compressed with Brotli: the same module at about a quarter of the size. Serve it with Content-Encoding: br and Content-Type: application/wasm and the browser decodes it, or let zipp.mjs 1.2.0 load it |
zipp-0.0.29-javascript-lite.wasm.br | 751,404 | ZIPP Lite, Brotli-compressed |
zipp-0.0.29-javascript-python.wasm.br | 2,005,031 | JavaScript + Python with torch, Brotli-compressed |
zipp-0.0.29-javascript-python-base.wasm.br | 1,630,162 | JavaScript + Python without torch, Brotli-compressed |
zipp-0.0.29-torch-package.wasm.br | 403,018 | The torch package, Brotli-compressed |
zipp-0.0.29-wasm-embed-kit.zip | 217,316 | The loader zipp.mjs 1.2.0, the one file a page needs beside an engine, with its TypeScript types, the engine API types, the host SDK, the GPU lab, the docs and examples. It loads a .wasm.br too: decoded by the server, decompressed by the loader where the runtime can (Node, Firefox), or by falling back to the plain .wasm beside it |
SHA256SUMS | 1,590 | Checksums for all 16 files above |
Release notes and downloads on GitHub · docs/releases/0.0.29.md · v0.0.28 notes · v0.0.27 notes · v0.0.26 notes · v0.0.25 notes · v0.0.24 notes · v0.0.23 notes
Install
# Windows: the portable .exe runs from wherever you saved it
.\zipp-0.0.29-windows-x86_64-portable.exe js app.js
# or install zipp-0.0.29-windows-x86_64-installer.msi, which adds zipp to
# your PATH without administrator rights
zipp js app.js
# Linux x86-64 (zipp-0.0.29-linux-arm64 or -linux-armv7 on Arm), glibc 2.35+
curl -fL -o zipp https://github.com/f2i-com/zipp.org/releases/download/v0.0.29/zipp-0.0.29-linux-x86_64
chmod +x zipp
./zipp js app.js
# WebAssembly, for a web page: the loader zipp.mjs from the embed kit, and one
# engine (or its .wasm.br: the same engine, about a quarter of the size)
curl -fLO https://github.com/f2i-com/zipp.org/releases/download/v0.0.29/zipp-0.0.29-wasm-embed-kit.zip
unzip -j zipp-0.0.29-wasm-embed-kit.zip zipp-0.0.29-wasm-embed-kit/zipp.mjs
curl -fLO https://github.com/f2i-com/zipp.org/releases/download/v0.0.29/zipp-0.0.29-javascript.wasm
# From source, any platform with Rust 1.92
git clone https://github.com/f2i-com/zipp.org && cd zipp.org
cargo build --locked --release
./target/release/zipp --version --jsonZipp is not on crates.io or npm yet. The WebAssembly engines and the embed kit are meant to be served by your own host, over HTTP: a page needs zipp.mjs from the kit beside whichever .wasm it loads. Serve a .wasm.br with Content-Encoding: br and Content-Type: application/wasm and the browser decodes it; zipp.mjs 1.2.0 also loads one itself, decompressing it where the runtime can or falling back to the plain .wasm beside it. The embed section of the home page has a starter project, and the WebAssembly page explains the loader, its sandboxes and the Worker model.
Up to v0.0.25 the downloads were archives: zipp-<v>-x86_64-pc-windows-msvc.zip for Windows, zipp-<v>-x86_64-unknown-linux-gnu.tar.gz for Linux, which unpacks to a folder holding zipp, and zipp-wasm-<v>-web.zip and its siblings for the WebAssembly engines. From v0.0.26 they are the plain files above, and the WebAssembly page describes the engine files and the embed kit.
What a release has to pass
Pushing a vX.Y.Z tag runs the release workflow. It refuses to publish unless the tag object matches the checkout; the root Cargo.toml, the WebAssembly crate and the landing page all carry the same version; and the reusable CI, the full security workflow (including the pinned Test262 corpus), the native build and the WebAssembly build all pass at that exact commit. A green main at some other revision is not a release gate. The job is retry-safe: it re-downloads existing assets, verifies SHA256SUMS, and checks that BUILD-INFO.json is not dirty and names the right commit before deciding to do nothing. A dispatched re-run may skip the two longest gate jobs - the native workspace suite and Test262 - only when the identical tree has been through them elsewhere; v0.0.19 was published that way, with both run locally on the tagged commit (308 test binaries, 2,453 tests; 95,680 of 95,680 corrected-core executions) and every other job in the workflow, and so was v0.0.20, whose JavaScript engine source had not changed since v0.0.19 passed them. From v0.0.21 the workflow also builds the torch package with the two engines it pairs with, and refuses to publish unless python plus the package prints exactly what all prints over the torch suites. From v0.0.22 it also builds ZIPP Lite. v0.0.24's first run lost four gate jobs to GitHub runner shutdowns, and those jobs were re-run at the same commit before it published. v0.0.27 was dispatched the same way: its tagged commit changes only versions and release notes from 05d2bd9b, where the full security workflow, the native workspace suite and Test262 on 64-bit and 32-bit builds included, had passed. So was v0.0.28, after the CI and the full security workflow had passed on its tagged commit itself. So was v0.0.29: the full security workflow on its prep commit, 8cd844fd, had failed one test, a heap-ceiling regression, whose fix and the heap and limit tests around it were run before 58c92a59 was tagged, and Test262 then passed on the published Windows binary, with its JIT and without.
All releases
| Version | Date | Headline |
|---|---|---|
| v0.0.29 | 2026-10-23 | Embedded scripts' own positions, bounded host requests and a checked redirect; one shared copy of a script's source and a zipp js code cache; a heap ceiling that collects before it convicts |
| v0.0.28 | 2026-10-21 | Eleven reported issues fixed; import.meta.url, unhandled-rejection reports, V8-format Error.stack and run_script; Babel and TypeScript run more than twice as fast |
| v0.0.27 | 2026-10-18 | Seven reported embedding issues fixed; regular expressions compile in bounded time; a Brotli .wasm.br beside every WebAssembly engine |
| v0.0.26 | 2026-10-18 | Plain downloads, Linux arm64 and armv7 included; one-file WebAssembly engines in a default-deny sandbox; the latest Test262, unmodified, on 64-bit and 32-bit builds |
| v0.0.25 | 2026-10-15 | Ten reported embedding issues fixed; the safe-sandbox interpreter at 0.84× Bellard's QuickJS; script globals in their slots; evaluated code freed |
| v0.0.24 | 2026-10-14 | Eight reported issues fixed; more of JavaScript compiled; Python at 1.09× CPython; torch at 4.2× PyTorch; smaller modules |
| v0.0.23 | 2026-10-12 | Memory grown in place collected; builtins call compiled code directly; Python at 1.30× CPython; smaller modules |
| v0.0.22 | 2026-10-10 | ZIPP Lite; an application bridge for hosts; member calls fast again under the strict call order; modules 11% to 15% smaller |
| v0.0.21 | 2026-09-25 | Python at about 1.75× CPython with a JIT tier; the torch layer checked against PyTorch 2.11; torch as a WebAssembly package; native GPU through wgpu |
| v0.0.20 | 2026-09-18 | Quantized Q4_K and Q6_K weights on the GPU path, matmul_fixed, reproducible Rust kernels, and Hugging Face modelling files running unmodified |
| v0.0.19 | 2026-09-16 | Resident GPU training sessions, torch.compile prepare, native version-2 kernels; 324 reviewed defects fixed |
| v0.0.18 | 2026-09-14 | Python playground, Torch GPU support and conformance updates; first WebAssembly archive with Python |
| v0.0.17 | 2026-09-12 | Audited engine hardening: VM rooting, coercion, TypedArray, parser, GC and metadata; preserves the exact 95,939 / 95,942 Test262 result on the previous corpus |
| v0.0.16 | 2026-09-12 | The two audits of 11 September: 24 engineering tickets and 14 close-audit tickets |
| v0.0.15 | 2026-09-07 | The audit response: spec-order method calls by default, accel spec grammar, transactional host.call, zippProfile(), CI gate |
| v0.0.14 | 2026-09-06 | The accel bridge |
| v0.0.13 | 2026-09-02 | A host-sized instruction budget |
| v0.0.12 | 2026-09-02 | Inline stores into pinned young dense arrays; x | 0 fused into the wrapping add; 21 of 30 benchmark rows faster than Node |
| v0.0.11 | 2026-09-02 | Register classes keep tokenizer loops on the INT tier (parse-large-js 1.24× to 0.88× Node); a forced-JIT segfault on user-overridden Math.random fixed |
| v0.0.10 | 2026-09-01 | Hardened limits sized for applications rather than snippets: 1 GB instance ceiling, 512 MB heap budget |
| v0.0.9 | 2026-09-01 | Collections scheduled on bytes, not only allocation count, after an emulator died ninety seconds into a game |
| v0.0.8 | 2026-09-01 | renewInstructionBudget and setFingerprintSeed; the 50M lifetime budget had been a fuse on every long-running embedder |
| v0.0.7 | 2026-09-01 | ArrayBuffer ceiling raised from 1 MB to 32 MiB |
| v0.0.6 | 2026-09-01 | Runtime optimization, exact WebAssembly benchmarks, QuickJS-NG comparison source |
| v0.0.5 | 2026-08-31 | Benchmark evidence publication |
| v0.0.4 | 2026-08-31 | getGlobalsFingerprint: a content digest so a mutation through a reference cannot be missed; per-tick host sync 9.6 ms to 2.1 ms |
| v0.0.3 | 2026-08-31 | Interpreter-only WASM stops an O(heap) walk; JSON.stringify ×4000 from 919 ms to 8.5 ms; wasm-opt dropped after measurement |
| v0.0.2 | 2026-08-31 | The boundary tax: the host boundary stopped walking the whole heap per re-entry; parser sandbox limits raised |
| v0.0.1 | 2026-08-30 | First native and WebAssembly distribution |
Release notes for v0.0.1 through v0.0.17 live in the annotated tag messages; v0.0.18 is the first with a notes file in docs/releases/, and from v0.0.20 that file is the GitHub release body verbatim. The engineering journal tells the story between the tags.