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/RDRANDandLOCKatomics. - Loader. Static ELF, then static-PIE, then dynamic linking:
the real
ld-muslboots 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 addwork over the real internet. - Filesystems. tmpfs, a copy-on-write overlay, a read-only
squashfs root through fstool, synthesized
/dev,/procand/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'sseq_rewriterreplace rules, and many smaller axioms linkingprefixof,str.at,str.indexofand 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^0folding, 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, includingsqlite3_create_function, window functions, update, commit and rollback hooks, andsqlite3_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,.showand 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.