2026-09-06

Weekly open source: an emulator goes from a 6502 to booting Linux, and a coding agent on the stack

A heavy week, and most of it went into one repository. rsemu, the emulator started last Sunday, spent its first full week climbing from a single 6502 to boards that boot unmodified Linux kernels on three architectures. Around it, the stack's lower layers kept tightening: purecrypto took a security-audit sweep, and a new encoding crate, charcode, let fstool — which rsemu uses for its disks — drop most of its third-party dependencies. And atelier began: a small AI coding agent assembled out of the stack's own pieces.

rsemu: from a 6502 to Linux

rsemu is the pure-Rust emulator that builds its framework first and describes machines in .machine files. This week (over 600 commits) the framework got put to work, and its README at week's end lists ten CPU cores with a measured conformance result for each where a public corpus exists: the 6502 at 2,560,000 / 2,560,000 SingleStepTests vectors including bus traces, the Z80 at 1,604,000 / 1,604,000 plus zexall 67/67, RV64GC at 409/409 riscv-tests and 181/181 riscv-arch-test against the Sail model, the 8086/8088, a MIPS R3000A at 55,000 / 55,000, the 68000 passing all 124 instruction files, the Game Boy's SM83, ARMv5TE, ARMv7E-M and AArch64 — the last against a suite rsemu builds itself, because none exists to download.

On those cores, 34 machine files:

  • Consoles — the NES (NTSC, PAL and Dendy) passes AccuracyCoin 141/141, the whole-machine accuracy test, with an empty known-failures ledger, after a long run of PPU, APU and DMA timing fixes. The Game Boy reaches blargg 12/12 and mooneye 59/66; a Sega Master System came in as the second proof that the core is generic.
  • Small computers — an Apple 1 you can type at, and Ben Eater's 6502 breadboard computer running the 1976 Woz Monitor.
  • Boards that boot other people's software — riscv-virt runs OpenSBI on a device tree generated from the realized machine and boots Linux 6.12 to a shell, plus EDK2 to a UEFI shell; riscv-virt-smp brings up two harts. arm64-virt boots a Debian arm64 kernel to busybox and mounts an ext4 root from a virtio disk. On x86, q35-linux boots a stock Gentoo 6.6 kernel that finds generated ACPI tables and reads off an NVMe namespace, q35-uefi brings OVMF to its Shell> prompt, and pc-at boots FreeDOS 1.3 on a legacy BIOS rsemu writes itself.

Underneath, the execution engines grew too: a translation IR with superblocks, a software TLB and an x86-64 host JIT (on the x86 core, 99.3% of a Linux boot now runs inside translated blocks), a KVM backend that boots Linux to userspace on host silicon, a user-mode runner that executes static and glibc Linux binaries — SQLite, Lua and coreutils — and a GDB remote stub and a VNC server. The browser demo was rebuilt in Vue 3 and now runs the PC/AT. Disk images go through fstool, and the dependency list under --all-features fell from 33 crates to 10 as fstool shed its own. The roadmap also settled a question: nixvm will depend on rsemu rather than merge into it.

purecrypto: an audit sweep, and AVX-512

purecrypto, the no_std crypto toolkit under the whole stack, spent most of its 96 commits on hardening that reads like an audit report worked through line by line: fresh RSA blinders per operation, rejection of small-order Ed25519/Ed448 keys, zeroized ECDSA nonces and DRBG state, the Lucky13 equaliser rid of its secret-sized allocation, TLS_FALLBACK_SCSV honoured, a wildcard-SAN bypass of name constraints closed, bounded CRL and PKCS#12 work, Falcon signature malleability pinned, and a CLI that issues certificates with random serials and no longer copies CSR SANs by default. QUIC gained connection migration, 0-RTT resumption, server preferred address and graceful close — then a round of DoS bounds. On the speed side, AVX-512 kernels for ChaCha20 (1.9× over AVX2), BLAKE3, 16-lane SHA-256 and 8-way Keccak, wired into the post-quantum schemes. Released as v0.8.0 and v0.8.1, which rsurl and puressh picked up straight away.

atelier: a coding agent from the stack's parts

atelier is "a minimal-TUI AI coding harness written in Rust": an agent loop that talks to OpenAI-compatible model APIs, runs tools inside a project directory, speaks MCP, and feeds itself fresh context each turn — git status, diff, layout, cargo check diagnostics. The interface is deliberately small: one input line and a status strip, with everything else appended to the terminal scrollback. It reuses the stack — rsurl for HTTP and tomlproc for its config — and its node tool runs JavaScript on kataan: scripts are confined to the project directory, network access is gated, and runaway scripts are stopped through the cooperative host interrupt that kataan added in its v0.0.9 release this same week. Permissions follow confinement — file tools confined to the project run without prompting; bash, MCP tools and networked scripts ask. By week's end it had sessions that persist and compact themselves into a rolling summary, token-budgeted context, image input, a multiedit tool, MCP over stdio and Streamable HTTP, and a --print headless mode.

charcode: encodings, and a lighter fstool

charcode is character-encoding conversion for Rust: the WHATWG Encoding Standard — the encodings, labels and error behaviours browsers actually use — with no dependencies, no unsafe, and no_std support, plus an iconv-style CLI. It then went further than the standard: because the standard deliberately maps labels like shift_jis or big5 to supersets, charcode added the charsets those labels actually name — Shift_JIS and EUC-JP themselves, ISO-2022-JP, -JP-2, -KR and -CN, GB 2312, Big5, true ISO-8859-9 and TIS-620, UTF-7, SCSU — each behind its own feature, and keeps the browser's substitutions behind a separate lookup.

It was put to use immediately. fstool replaced encoding_rs with charcode, dropped thiserror, crc32fast and crc32c, moved APFS case-folding onto intl, and switched to tomlproc: its codecs build is now seven crates, three of them first-party (compcol, charcode, intl), with uuid the only third-party name left.

Also this week

  • teamclaude — the multi-account proxy got per-request cost accounting, copy/paste OAuth for headless machines, one bounded failover hop on rate limits or 5xx, expiry-pressure account selection, and Codex interception in MITM mode.
  • kataan — v0.0.9 with the host interrupt, plus a hundred-odd test262 fixes across arrays, regex, builtins and the parser, and two O(n²) paths removed (Array.prototype.sort, for-of).
  • pktkit-rs — WireGuard and OpenVPN moved all their crypto onto purecrypto, dropping rustls; VLAN access/trunk ports on the L2 hub.
  • nixvm — fair virtual-runtime scheduling, real job control, setuid privilege drops, SCM_RIGHTS fd passing, the full clone3 flag set.
  • catcard — the Coldcard firmware got a boot splash with a hand-drawn cat, a font-agnostic text layer, and the PIN login sequence.
  • selecard — new: reverse engineering of the discontinued Bunka Shutter SeleCard II and III garage-shutter remotes, recovered purely over the air, with Python tools for HackRF and YARD Stick One to decode and reproduce OPEN / STOP / CLOSE.
  • rsurl — downloads to anonymous temp storage, CI on the libc-free fullrust target.
  • z3rs — a model-constructing nlsat search over QF_NRA as a CAD fallback, get-consequences, and root-obj terms.
  • oxideav — oxideav-midi went native on MIDI 2.0 (UMP, Clip Files, MIDI-CI, per-note controllers) with SoundFont LFOs and modulators; oxideav-tiff grew its own JPEG encoder for JPEG-in-TIFF; oxideav-ac3 refined its encoder and fixed E-AC-3 broadcast decoding.

Next week

rsemu has a long list of documented stopping points — each board records where it stops, not just where it gets to — and those are the work queue, along with more of the JIT. atelier keeps working through its milestone roadmap. purecrypto and the crates that depend on it settle onto the hardened release.