Latest: v0.0.21, 25 September 2026

Python on the command line runs at about 1.75× CPython 3.13's time with a new JIT tier, from about 22× when the work began. The torch layer grows to what ordinary training code uses, checked against PyTorch 2.11; torch becomes an optional WebAssembly package; and zipp py runs torch.compile graphs on a hardware GPU through wgpu, a small model's training step faster than PyTorch's eager CUDA on the same card.

  • Python speed: direct calls, per-VM inline caches, fused Python instructions, small integers in the value word, native dict, set and instance storage, and a JIT tier for hot loops. range_loop, int_arith, float_arith, tuple_swap and global_read beat CPython; a warm hello-world starts in about 20 ms.
  • Python compatibility: CPython's tracebacks and traceback module, complex numbers and cmath, and Python compiled directly from Zipp's own syntax tree (zipp-pyparse), with the RustPython fork removed.
  • Torch: about 200 more tensor functions, the common layers, losses, optimizers and schedulers, torch.utils.data, native torch.linalg and torch.fft, torch.distributions, half-precision, complex, sparse and quantized tensors, and single-process torch.distributed; GPT-Neo's modelling file now runs unmodified.
  • WebAssembly: python without torch (1.70 MB on the wire) plus the 0.38 MB zipp_torch.wasm package, beside all with torch built in (2.06 MB); prewarmPython() brings the first browser run to about 20 ms.
  • Native GPU: wgpu over Vulkan, Direct3D 12 or Metal, native replay of prepared steps, exact kernel fusion and a 128x128 matmul tile. On an RTX 5090 a small MLP's prepared step takes 0.27 ms (0.12 ms at eight per run) against 0.78 ms for PyTorch's eager CUDA. Graph protocol version 4 carries masks, dropout, slicing and gathers.
  • Engine: small BigInts as immediates (JavaScript BigInt code 2-4× faster), a compiler that emits the same bytecode on every run, and fixes to a JIT wrap, a destructuring TDZ case and nested budget loans; Test262 passes as before.
v0.0.21 assets
AssetContents
zipp-0.0.21-x86_64-pc-windows-msvc.zipNative CLI for Windows, complete: JavaScript with the x86-64 JIT, Python with its JIT tier, torch and the native GPU path
zipp-0.0.21-x86_64-unknown-linux-gnu.tar.gzNative CLI for Linux, same contents
zipp-wasm-0.0.21-web.zipJavaScript-only browser engine, TypeScript bindings and the Worker host SDK
zipp-wasm-0.0.21-web-python-base.zipJavaScript + Python without torch
zipp-wasm-0.0.21-web-python.zipJavaScript + Python with torch built in, the browser GPU adapter, CPU WASM kernels and the Torch compatibility guide
zipp-wasm-0.0.21-web-torch.zipThe torch package: zipp_torch.wasm and its zipp_torch.js loader, for web-python-base
SHA256SUMSChecksums for every asset; each WASM archive also carries BUILD-INFO.txt, PROFILE.json and its own SHA256SUMS

Release notes and downloads on GitHub · docs/releases/0.0.21.md · v0.0.20 notes

Install

From a release archive
# Linux
curl -LO https://github.com/f2i-com/zipp.org/releases/download/v0.0.21/zipp-0.0.21-x86_64-unknown-linux-gnu.tar.gz
tar xzf zipp-0.0.21-x86_64-unknown-linux-gnu.tar.gz
echo 'console.log("hello")' > hello.js
./zipp-0.0.21-x86_64-unknown-linux-gnu/zipp js hello.js

# 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 --json

Zipp is not on crates.io or npm yet. The WebAssembly archives are meant to be served by your own host; the WebAssembly page explains the Worker model and cache-key discipline.

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.

All releases

Tags, dates and the headline from each tag annotation
VersionDateHeadline
v0.0.212026-09-25Python 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.202026-09-18Quantized Q4_K and Q6_K weights on the GPU path, matmul_fixed, reproducible Rust kernels, and Hugging Face modelling files running unmodified
v0.0.192026-09-16Resident GPU training sessions, torch.compile prepare, native version-2 kernels; 324 reviewed defects fixed
v0.0.182026-09-14Python playground, Torch GPU support and conformance updates; first WebAssembly archive with Python
v0.0.172026-09-12Audited 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.162026-09-12The two audits of 11 September: 24 engineering tickets and 14 close-audit tickets
v0.0.152026-09-07The audit response: spec-order method calls by default, accel spec grammar, transactional host.call, zippProfile(), CI gate
v0.0.142026-09-06The accel bridge
v0.0.132026-09-02A host-sized instruction budget
v0.0.122026-09-02Inline stores into pinned young dense arrays; x | 0 fused into the wrapping add; 21 of 30 benchmark rows faster than Node
v0.0.112026-09-02Register 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.102026-09-01Hardened limits sized for applications rather than snippets: 1 GB instance ceiling, 512 MB heap budget
v0.0.92026-09-01Collections scheduled on bytes, not only allocation count, after an emulator died ninety seconds into a game
v0.0.82026-09-01renewInstructionBudget and setFingerprintSeed; the 50M lifetime budget had been a fuse on every long-running embedder
v0.0.72026-09-01ArrayBuffer ceiling raised from 1 MB to 32 MiB
v0.0.62026-09-01Runtime optimization, exact WebAssembly benchmarks, QuickJS-NG comparison source
v0.0.52026-08-31Benchmark evidence publication
v0.0.42026-08-31getGlobalsFingerprint: 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.32026-08-31Interpreter-only WASM stops an O(heap) walk; JSON.stringify ×4000 from 919 ms to 8.5 ms; wasm-opt dropped after measurement
v0.0.22026-08-31The boundary tax: the host boundary stopped walking the whole heap per re-entry; parser sandbox limits raised
v0.0.12026-08-30First 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.