Back to blog

kern v1.0.0-rc2, reproducible across two machines

1.0.0-rc2 is the second release candidate, cut to drive the tag-release pipeline end to end so registry artifacts are built by CI rather than hand-uploaded, and to carry the fixes accumulated on main since rc1 into a coherently-versioned build. It also moves the trust story: reproducibility is no longer single-machine. The compiler IR is now byte-for-byte identical across two machines and two operating systems. And three practical features land: static file serving that actually works, a safe escape hatch for long-lived state, and tooling that turns two adopter claims into checks.

1,014
Tests, 100% pass
2 × 2
Machines and OSes: compiler IR byte-identical (manual)
272
Stdlib modules, 1,961 functions
0
Data races (ThreadSanitizer-verified)

What "1.0.0-rc2" is, exactly

rc2 is a small, deliberate step, not a feature wave. It was cut for two reasons.

The honest-framing rule from rc1 still holds: the language implementation is 1.0-grade (it self-hosts, the full suite is green, the concurrency model is race-free, the build is reproducible), and the verifiable-trust goal is mid-roadmap. What changed in rc2 is one of the trust rows.

Reproducibility moves past single-machine

The single biggest caveat on rc1 was the word single-machine: everything was evidenced on the one box that built it. rc2 breaks that for the compiler's intermediate representation.

The honest boundary is precise, and worth stating rather than blurring: the IR is reproducible cross-machine and cross-OS; the whole binary is reproducible on one box; and none of it is yet a per-commit CI gate or externally audited. The live TRUST.md dashboard marks each of these rows as manual, not gated. The direction of travel is what matters: trust is becoming a property a second machine re-derives, not a promise the author makes.

Static files that actually serve, over HTTP and HTTPS

http_static(url_prefix, dir) used to be a no-op: it recorded the mount and never read it, so every static path 404'd. In rc2 it serves files, and it does so on both the plain-HTTP worker and the TLS server.

A safe escape hatch for long-lived state: persist

Kern can run HTTP requests under an epoch garbage collector (KERN_HTTP_EPOCH_GC): every object allocated during a request is reclaimed in one shot at the end of the request, which is fast and leak-proof for request-scoped work. The sharp edge is global state. If you take a request-derived value, say a client IP, and store it into a long-lived global map (a rate-limiter's table, a cache), the arena pages it lived in are munmap'd at request end and the key dangles, which is a hard segfault, not a subtle bug.

persist(s: str) -> str is the fix: it returns a permanent-heap copy of the string, safe to store in global state even when called inside a request epoch. It is implemented as a thread-local redirect in the GC allocator that copies the bytes onto the permanent heap without disturbing epoch or collection semantics, verified with a C escape reproducer and test_persist.kern. It is the smallest primitive that makes an in-process rate-limiter or cache correct under epoch GC, chosen over a narrower keyed-limiter built into the runtime.

Adopter tooling: version pinning and a Docker-independence attestation

Two features came straight from adopters, and both turn a claim into a check you can run.

The standard library continued to grow alongside these: it is now 272 modules and 1,961 public functions across std, data, net, db, and sys.

Where verifiable trust stands: Steps 2 to 7 of 12

The trust program is a 12-step roadmap, and being honest about a release means being honest about which steps are done and how far. rc2's progress lands in the reproducibility rows, which are no longer confined to the build host:

What stands between rc2 and 1.0.0 final

The remaining five steps are exactly the difference between "trust we can evidence here, on two machines" and "trust a third party can re-derive on a per-commit basis." None are aspirational; each has a Done-when clause on the roadmap.

Every item is on the ROADMAP with a checkbox and a Done-when clause. A trust claim with no check is not done.

By the numbers

Try v1.0.0-rc2

Install on Linux or macOS. Single binary, no runtime dependencies.

terminal
curl -fsSL https://kern-lang.eu/install.sh | bash
Get Started View on Codeberg