2026-07-12

Weekly open source: a Linux sandbox with no guest kernel, and a barcode library from scratch

Another heavy week by commit count: just over 3,000 commits. Two new projects started. nixvm is a sandbox that runs a real Linux userland without booting a Linux kernel. anydcode is a barcode library written from scratch. The three big engines from earlier weeks also kept moving: z3rs spent the week checking itself against the real Z3, graphitesql tagged its first 0.1 release, and kataan implemented the whole Temporal API.

nixvm: Linux syscalls, without a Linux kernel

nixvm is "a portable, VM-style sandbox that runs a real Linux userland by emulating Linux syscalls directly — not by emulating hardware." It takes the gVisor-style approach: there is no guest kernel. A stock Alpine userland runs either on the host CPU or on a software interpreter. When a guest process executes syscall or svc, control traps out to nixvm's own kernel, written in Rust, which handles files, memory, processes, threads, signals and networking in userspace. The point is to run risky jobs like npm install, pip install or untrusted build scripts in isolation, with or without hardware virtualization.

The repo was created on Friday and had 188 commits by Sunday. Built in roughly this order:

  • CPU interpreters. An aarch64 interpreter grew from "hello world" to enough of the ISA for real busybox: NEON, scalar and vector FP, LSE atomics, CRC32, AES/SHA instructions. An x86-64 interpreter followed with SSE/SSE2, an x87 subset, CPUID/RDRAND and LOCK atomics.
  • Loader. Static ELF, then static-PIE, then dynamic linking: the real ld-musl boots stock Alpine binaries.
  • Kernel. fork/exec/wait4 with a scheduler (so pipelines work), shared-address-space threads with real futexes, an SMP pool of vCPU host threads, poll/epoll/eventfd/timerfd, signals, file-backed and copy-on-write memory, and a virtual network stack: AF_UNIX, TCP/UDP loopback, a netlink stub, and finally host egress, so apk update && apk add work over the real internet.
  • Filesystems. tmpfs, a copy-on-write overlay, a read-only squashfs root through fstool, synthesized /dev, /proc and /sys, and host-directory passthrough "holes", hardened so a guest symlink can't escape the mount root.
  • Hardware backends. Hypervisor.framework on macOS (EL0 execution, with a trap on svc) and KVM for x86-64 guests, where a full Alpine userland boots. The interpreter remains the fallback.

Because the interpreters and the kernel are portable Rust, the whole thing also compiles to WebAssembly. A Vue + xterm page on GitHub Pages boots Alpine in the browser on either architecture, from an in-memory squashfs. The rootfs tarball is decompressed in-process with compcol, the same no-C stack again. Node.js loads its whole shared-library graph, though the commits record that its event loop still busy-spins on futex/epoll.

anydcode: 50+ barcode symbologies, round-trip exact

anydcode (crate anyd) is "a from-scratch Rust library for decoding and encoding 1D and 2D barcodes." Its design goal is lossless round-trip: a decoded symbol keeps the payload and every encoding decision (segmentation, version, EC level, mask), so re-encoding it gives the original symbol byte for byte. Detection is split into a cheap per-frame pass (locate and classify) and a heavier decode pass, so the library suits live video.

Created on Saturday, it worked through its catalogue in one sitting and ended the week with every modeled symbology implemented:

  • 2D matrix: QR, Micro QR, rMQR, Data Matrix, Aztec and Aztec Runes, MaxiCode, Han Xin, DotCode, Grid Matrix, and Apple App Clip Codes.
  • Stacked: PDF417, MicroPDF417, Code 16K, Code 49, Codablock F, and the GS1 DataBar stacked variants.
  • Linear and postal: Code 128 / GS1-128, EAN/UPC with add-ons, Code 39/93/11, ITF and 2-of-5, Codabar, MSI, Telepen, Pharmacode, DataBar, POSTNET/PLANET/IMb, RM4SCC/KIX, Australia Post, Japan Post, Mailmark, and DX film edge.

Then came real photographs. The QR sampler gained adaptive binarization, thin-plate-spline dewarping for curved surfaces (a curved, blurred bottle is now a regression fixture), and timing-anchored per-module sampling. EAN/UPC moved to edge-width decoding for real camera captures. A WASM demo, built without wasm-bindgen, generates all 51 symbologies, decodes images, and scans from the live camera in a Web Worker with tracked targets. It shipped as v0.1.1.

z3rs: checking itself against Z3

z3rs, last week's pure-Rust Z3 port, had the most commits of the week (426). Most of them close the gap with the real thing. The week opened with PARITY.md v2 and a differential harness against Z3's own regression corpus. Most of what followed is what that harness and differential fuzzing turned up:

  • Strings and sequences (QF_S) got about a hundred commits: Nielsen transformation to refute word equations, regex refutation for str.contains, a port of Z3's seq_rewriter replace rules, and many smaller axioms linking prefixof, str.at, str.indexof and concatenation splits.
  • Quantifiers: full Presburger quantifier elimination (Cooper) for integer ∀x∃y, nested QE for linear reals, and finite-domain expansion for narrow bit-vectors.
  • Arithmetic, arrays, datatypes: a dark-shadow witness for QF_LIA, nonlinear integer witnesses with real models, array extensionality and (_ map f) equalities, enum pigeonhole refutation, and recursive CHC decided in both directions.
  • Soundness. Around 45 commits fix unsound or spurious answers: datatype acyclicity, 0^0 folding, FP markers leaking past the unknown gate, a wrong-unsat in the CHC engine. They are the kind of bug only a differential sweep finds.

The output format now matches z3's (bit-vector numerals, model layout, unsat cores, MaxSAT penalties in get-objectives), and three releases went out, v0.0.6 through v0.0.8.

graphitesql: v0.1.0 and a C ABI

graphitesql, the pure-Rust SQLite, put in 341 commits and tagged v0.1.0. Breadth is what changed most:

  • graphitesql-capi, a sibling crate with a libsqlite3-compatible C ABI, including sqlite3_create_function, window functions, update, commit and rollback hooks, and sqlite3_error_offset. Existing C callers can link against it.
  • sqlite3_session changesets: generation, invert, concat, and apply with custom conflict handlers.
  • FTS5 external-content tables, maintenance commands, prefix indexes, and incremental delete/update via tombstone segments.
  • Concurrency. A shared wal-index for multi-connection WAL readers, and a read lock taken on the first read of a transaction.
  • Planner and VDBE. Correlated subqueries, aggregate joins and sort elision via indexes now run on the bytecode engine.
  • A long tail of exactness fixes: text values are now stored as bytes, so non-UTF-8 text round-trips the way SQLite's does. The shell gained .mode, .import, .show and SQLite-style error carets.

kataan: Temporal, and a generic JIT tier

kataan, the JavaScript engine for the argus browser, moved past grinding through test262 one case at a time. It scaffolded Temporal and implemented all of it during the week: the seven plain types, ZonedDateTime with timezone data, non-ISO calendars and calendar-aware arithmetic, and Duration rounding. By the end of that run a commit reports built-ins/Temporal at 0 failures. Intl was rewired onto the CLDR data from intlrs, the pure-Rust ICU analog, so Temporal can format through DateTimeFormat.

Other work this week: ShadowRealm isolation, Iterator.zip, import attributes and JSON modules, Atomics wait/waitAsync on a virtual clock, an event loop with timers, and node-style Buffer, path and process. In the JIT, a generic NaN-boxed tier gained control flow, inline property and element fast paths, and direct JIT→JIT calls.

Also this week

  • oxideav-av1 turned into an encoder: a conformance-grade keyframe encoder, then P-frame inter coding with quarter-pel motion, rectangular partitions, switchable interpolation filters, and two-reference compound prediction. Self-encoded streams joined the conformance corpus (39 → 50).
  • puregit finished its roadmap: protocol v2 over HTTP, shallow and partial clones, reachability bitmaps, ssh-agent auth, SSH and OpenPGP commit signing and verification, and a libgit2-shaped C ABI.
  • puremp added the General Number Field Sieve, SEA point counting, ECPP primality proving, and algebraic number fields with class groups.
  • latticefoundry added a RISC-V RV64IM target. Its C frontend, lf-cc, now compiles GNU gzip (byte-identical output), bzip2, make and bash.
  • purecrypto had a performance pass: a 4-way AVX2 Keccak kernel shared by ML-KEM, ML-DSA and SLH-DSA, stitched AES-GCM, and comb tables for P-256 and edwards25519.
  • libwallet continued its Rust port: device-to-device keygen over the live Spot relay, RemoteKey shares, and legacy TSS signing.
  • oxideav-ifc worked through geometry phase 3 (boolean carving, swept solids, CSG) and began the semantic layer: property sets, materials, units, and georeferencing.
  • teamclaude added per-model routing and storm control to avoid a thundering herd on account switchover.

Next week

nixvm moves from booting Alpine to running real workloads, starting with Node's event loop. anydcode takes the decoders further on real camera input. z3rs keeps running its differential sweep, and graphitesql builds on 0.1.