By the numbers

Commits from 29 May to 14 September 2026
1,927

247 in May, 1,039 in June, 253 in July, 230 in August, 158 in September

Tagged releases in 16 days
18

v0.0.1 on 30 August to v0.0.18 on 14 September

First-party lines of Rust
353,522

477,943 including the two vendored forks

Pull request
1

Everything else landed on a linear trunk

Act one: a typed language with four back ends (29 to 30 May)

The first commit, a71a1bdc on 29 May 2026, is "Initial commit - ZIPP language v0": a tree-walking interpreter for a small statically typed language. Within the same day it had a Cranelift JIT for the integer subset that beat V8 on a hot loop, an LLVM release tier that matched V8 on dense doubles, a conservative mark-sweep collector, a deterministic gas-metered WebAssembly contract profile, a zero-knowledge back end that bound proofs to a program hash, and a TypeScript front end via oxc. By 30 May it was fusing map, filter and reduce chains.

None of that code survives. It is worth recording because the deletion, on 25 July, is one of the project's defining decisions.

Act two: the pivot to JavaScript (30 to 31 May)

On 30 May the subjects change: "prototypes, new, instanceof, in (the ES5 object model)", then "wire the zipp js <file.js> command". Two JavaScript engines were tried and discarded within a week. The one that stuck is 87174f64, "zipp-vm: clean-sheet JS engine v2 — explicit-frame register VM". The same day also contains "FIX broken build + RETRACT the false perf claims", the first of several retractions by name.

By 31 May the register VM had a native x86-64 JIT for hot integer functions, on-stack replacement for loop regions, call-free inline caches (object.js from 14 ms to 3 ms), scalar replacement of objects, rope strings, promises with a microtask loop, and its first legitimate win over V8: loop.js at 26.5 ms against 28.0.

Act three: the conformance march (1 to 14 June)

June has 1,039 commits. It opens with "tools: add test262 conformance runner" and "async generators — the biggest conformance lever". On 2 June alone: RegExp via a forked engine, TypedArrays, Proxy traps, Temporal type by type, the Intl namespace with all eleven services, splitting a 17,400-line vm.rs into a module folder, and a mark-sweep collector for the new VM. Then eval ("the #1 conformance lever"), ShadowRealm, ES modules with top-level await, blocking Atomics, WTF-8 strings, arbitrary-precision BigInt, proper tail calls, the honest ten-workload benchmark pack, six JIT soundness bugs from an adversarial audit, and on 14 June a function-level JIT on by default plus a checkable performance roadmap.

Then six weeks of silence.

Act four: the reckoning (25 July to 4 August)

The project returns on 25 July with the single most quotable commit in its history, 1217d683: "Fix the test262 runner; real pass rate is 96.97%, not 100%". The runner had been scoring one execution mode. The same day, 9ef187f9 "Focus the workspace on zipp-vm; rewrite the docs against measurements" deleted the AOT, Cranelift, LLVM, zero-knowledge and TypeScript crates. The Cargo.toml still explains it: those crates were removed rather than left to rot alongside code they no longer share anything with.

What followed was measurement: mimalloc (4.20× to 3.34× Node), fat LTO (about 2%), the zipp-wasm persistent embedding, a new in-house front end that took Test262 to 99.0%, Intl.DurationFormat and the IANA database, 30 failures to 5 with 22 of them runner defects, a sampling profiler, the first benchmark capture that could be attributed to a commit, PGO adopted at −13.3%, and a nursery whose first stage was refuted by its own prover before the third stage landed. The landing page went up on 4 August.

Act five: parity, audits, Python (19 August to 14 September)

The nursery went default-on on 19 August. On 20 August the headline dipped under 1.20× Node. On 21 August a tier-differential fuzzer found five live wrong-answer classes. On 23 August wave 19 decomposed the three rows that were 60% of the remaining gap, and on 24 August c6ffa200 recorded "cross Node parity at 0.9695x". ARM64 got a JIT and the sandboxes got hardened on 24 August; the hostile corpus went under parity on 27 August; a 2.16× regression on 29 August was root-caused to a de-fused call lowering and reversed the same day.

v0.0.1 shipped on 30 August. Ten more tags followed in three days as real embedders hit real limits: a Game Boy cartridge that could not fit in a 1 MB ArrayBuffer, an emulator killed by a lifetime instruction budget, a framebuffer encoder that outran the collector. 2 September produced the canonical capture, 0.728× Node across thirty rows.

September then turned to correctness. External audits on 11 and 12 September produced 38 tickets, closed in v0.0.15 through v0.0.17; making specification-order method calls the default cost the headline benchmark its lead, and the ledger says so. On 13 September, in one day, the repository gained a Python 3 frontend compiling to the same VM, WebAssembly build variants, a folder-based playground, GPU compute from Python through WebGPU and WebGL2, and a Torch subset with GPU training. On 14 September the pinned Test262 corpus passed 95,671 of 95,680 unmodified and 95,680 with five documented corrections, and v0.0.18 was published.

How the work was done

The archived handoff notes describe the August performance campaign as orchestrated workflows of AI coding agents: parallel scouts to refute the obvious suspects with measurements, parallel implementers with disjoint file ownership, and a verification gate that re-measures rather than trusting the lanes. The notes are candid about what that bought and what it cost: scouts refuted more than they proposed, which was the point; implementers disproved their briefings; honest under-delivery was reported as such; session limits killed mid-run workflows twice; and one verification pass was silently vacuous because prompt interpolation was over-escaped, so every verdict came back meaningless. The rule that came out of it: if you delegate verification, check that the agent actually received the finding.

The working rules that survive in the repository are the same ones a careful human team would write. Scout before building. Never promote a dirty, filtered, non-PGO or incomplete artifact. Record neutral and refuted ideas so they are not repeated; most entries in the 881 KB performance ledger are negative results, and the notes say they saved more time than the wins.

The honest thread

What makes this history unusual is that the corrections are in the subjects, not buried in bodies. "RETRACT the false perf claims." "Real pass rate is 96.97%, not 100%." "The INT tier was silently returning wrong answers on ordinary loops." "It is the COLLECTOR, not the allocator — pool built, measured zero, reverted." "The profiler was lying about a quarter of json-large." "B95 shipped a 19x pathology and the benchmarks could not see it." "The harness could name a commit it had never measured." Every one of those is a commit you can open.

  1. Initial commit: ZIPP language v0

    a71a1bdc. Cranelift, LLVM, WASM and zero-knowledge back ends by the end of the day.

  2. The clean-sheet explicit-frame register VM

    87174f64, the engine that survives.

  3. Test262 runner added

    79d10480.

  4. 96.97%, not 100%

    1217d683; the workspace narrowed to zipp-vm the same day.

  5. PGO adopted at −13.3%

    5cafcb10.

  6. Node parity crossed at 0.9695×

    c6ffa200.

  7. v0.0.1

    First native and WebAssembly distribution.

  8. The canonical capture

    0.728× Node across 30 rows at 8229b3fc.

  9. Python, the playground and GPU compute

    378b18de, 5fd22bcb, 8bb14918, 9651dd40.

  10. 95,680 of 95,680 corrected core; v0.0.18

    1539eb4b, fc474d15.