2026-08-09

Weekly open source: nixvm fills in POSIX, kataan down to 12 failures, catcard grows a wallet

The quietest week in a while, at about 300 commits, and a detail-oriented one. The syscall-emulating sandbox spent it making Linux behave the way programs expect, down to which poll bits a closed pipe reports. The JavaScript engine went after the last handful of test262 failures and the performance cliffs behind them. The week-old Coldcard firmware went from scaffold to a Bitcoin library with a screen, a keypad and a settings store.

nixvm: the corners of Linux

nixvm runs a real Alpine userland without a guest kernel. Guest syscalls trap out to a "kernel" written in Rust, in the gVisor style. This week's 31 commits were almost all about faithfulness, the kind of behaviour that tools only notice when it's wrong:

  • Signals. SIGPIPE on writes to a pipe or socket with no reader, rt_sigtimedwait (so sigwait/sigtimedwait work), sigqueue delivery, a working signalfd (it had been a stub that never became readable), the signal mask in ppoll / pselect6 / epoll_pwait, and signal deaths reported as WIFSIGNALED instead of WIFEXITED.
  • Time. A real nanosleep, per-task CPU accounting that agrees across clock_gettime, getrusage and times, and alarm/setitimer delivering SIGALRM.
  • Processes. POSIX process-group targeting for kill, the pid filter and child rusage in wait4/waitid, and /proc/self/{exe,cwd,root,comm,cmdline,stat,status,fd} reporting the live task. The CPU count now reports nixvm's own cores instead of leaking the host's through sysfs.
  • Files and IPC. O_APPEND, chmod and utimensat (these had been no-ops), FD_CLOEXEC, SEEK_DATA/SEEK_HOLE, EPOLLONESHOT, non-blocking pipe reads returning EAGAIN, and AF_UNIX datagram sockets for syslog's /dev/log.

kataan: 12 known failures

kataan (30 commits) went from 99.93% to 99.98% of test262: 51,878 of 51,890, 12 known failures. A roadmap entry also records why each of the last three failures "is not ours". The fixes went deep: program text is now carried as WTF-8 so lone surrogates survive parsing (+9), and @@replace concatenates WTF-8 canonically. Source-phase imports also landed. Intl picked up per-calendar eras and month names, formatRange routed through intl's range support, and intl 0.6.1's minimumGroupingDigits (+6).

The other half of the week was performance. Many string and array operations had a hidden O(n) per call. slice, substring, indexOf, at, push and delete all had one, built-in iterators copied their buffer on every step, and every property access on a string materialized it. The fixes are rope-joined concat and template literals, O(1) indexed reads with an ASCII fast path, and in-place rope flattening. Each one is logged in the roadmap as it closed.

catcard: from scaffold to a Bitcoin stack

catcard, the clean-room Rust firmware for Coldcard hardware started last Sunday, spent its first full week (17 commits) on the parts a wallet can't do without, each as a separate host-testable crate:

  • Keys and encodings: BIP-39 mnemonics and seed derivation, BIP-32 HD derivation over secp256k1, Base58Check, and Bech32 and Bech32m.
  • Addresses: P2PKH, P2SH-P2WPKH, P2WPKH and P2TR.
  • Signing: deterministic ECDSA and BIP-340 Schnorr, transaction parsing, and the BIP-143 sighash.
  • Hardware: an SPI master, an SSD1306 display driver with an 8×8 font, debounced keypad scanning with a self-test that echoes keys, an SPI-NOR flash driver, and an authenticated, power-fail-safe settings store on top of it.

One small commit says a lot about the approach: a panic handler "that does not leave secrets in RAM". A hardware validation plan was also written up, ahead of running any of this on a device.

decryptd: a v5 kernel ABI

decryptd, the GPU worker for a distributed-compute project, shipped nine releases (0.1.31 → 0.1.39). It picked up support for the v4 kernel ABI, then replaced it with v5 and dropped every older one. The worker now asks the compiled cubin what it is instead of reading a manifest, takes its work space from the platform instead of the job blob, and sizes launches to fit the output buffer. A run of fixes followed the platform's axis-order convention, and one notes that a brute-force box can exceed 2^128, so its size is no longer computed.

graphitesql: SQLite's function library

graphitesql, the pure-Rust SQLite (14 commits), filled in the extension functions real databases use: median / percentile / percentile_cont / percentile_disc, base64(), the decimal arbitrary-precision functions, regexp() to back X REGEXP Y, sha1() and sha3(), and the ieee754 set. sin/cos/tan got Payne–Hanek range reduction for large arguments. Multi-constraint ON CONFLICT now resolves in sqlite's own check order, and the C API gained 64-bit bind/result variants and zeroblob helpers.

OxideAV: encoders close out

  • oxideav-mpeg4video built its MPEG-4 Part 2 encoder in one sweep: a bit writer, forward DCT and quantisers, VLC emitters, an I-VOP encoder, then P-VOPs with motion estimation. A reference decoder reproduces its I+P streams bit-exact in a black-box cross-check. The DCT kernels were also made byte-deterministic across platforms.
  • oxideav-opus landed the CELT pitch pre-filter (the inverse of the decoder's post-filter), which the README calls the end of the encoder arc. SILK-layer rate control, VBR arms and stereo Hybrid encoding came before it.
  • oxideav-pixfmt reached matrix closure: all 3,660 ordered conversion pairs across its 61-format universe now resolve.
  • oxideav-mkv applies Matroska TrackOperation, joining blocks into virtual tracks and combining stereo-3D planes (RFC 9559 §18.8), with seeking on the virtual track.

Also this week

  • z3rs closed more of its corpus: trig argument reduction by periodicity, π recognition, FP constant folding under any rounding mode, and a fix for a latent wrong-unsat on nonlinear closed-universal negations.
  • fullrust ported its libc-free toolchain overlay through every Rust release from 1.90 to 1.95 in one week, and now self-tests its GitHub Action.
  • oxideav-bitstream gained a complete H.266 VPS walk with a byte-exact writer, plus a VP9 keyframe header writer.
  • oxideav-embroidery widened to PHB, VIP, the plain-text .col companion and the Singer XXX header.

Next week

nixvm keeps closing semantic gaps as real workloads find them, and kataan's remaining failures are now a short list. catcard's validation plan points at real hardware next. OxideAV keeps moving codec by codec toward byte-exact encode and conformance.