crier
crier — the project dispatch · from the bare metal up · 42 repositories

Modus‑Lisp


A personal computer written from scratch in Common Lisp — a kernel that boots on bare hardware, and above it a desktop, a browser, a text rasterizer, a TLS stack and forty other libraries, each written as though the operating system underneath might not be there. On the machine this is aimed at, it isn't.

the weekly

This Week in Modus

What moved, across every repository in the workspace, and why it was hard. Every claim comes out of the commit log, and where one reaches outside it the method note at the foot of the issue says so — along with what was measured and what was left out. Numbering runs from the project's first working week, so № 1 is in March 2025 and the count is the number of weeks that have had commits in them. Every week of the project has an issue.

Latest

  1. № 25
    29 Aug 26
    The Pi Zero answers the doorbell A real OpenSSH client logs in to bare-metal Modus on Pi Zero 2 W silicon, then downloads a library and runs it — and the desktop above it learns its own name and its own resolution. 97 commits.
  2. № 24
    22 Aug 26
    The stack learns to leave home kiln and glass-sdl appear, the CL stack runs a REPL on real Pi Zero silicon, one HTTP client replaces four, and half a dozen repos stop assuming whose home directory they are in. 136 commits.
  3. № 23
    15 Aug 26
    Two packages, one variable Nine of Modus's name-keyed registries turn out to be blind to packages, one of them mis-dispatching in silence; the build starts checking itself; and alexandria finishes at 230/230. 273 commits.
  4. № 22
    8 Aug 26
    Speech, both ways A text-to-speech engine, a speech recognizer, and a desktop that types what it hears into whichever window has focus. Underneath, the JIT stops falling back to the interpreter. 218 commits.
  5. № 21
    1 Aug 26
    629 bytes of desktop A VP8 encoder written from the RFC goes from its first entropy coder to Safari decoding a live Lisp desktop, in twenty-three hours. Also a PDF renderer, three audio decoders, and Acid3 at 100/100. 294 commits.

From the beginning

  1. № 4
    14 Mar 26
    The Fixpoint of Theseus Five SHA-256 comparisons prove the compiler leaves no fingerprint of the machine that ran it: a 32-bit image builds a 64-bit one bit-identical to the 64-bit build. Then Movitz is deleted. 3 commits.
  2. № 3
    7 Mar 26
    A Pi with no SD card Modus leaves the emulator: real Pi Zero 2 W silicon, booted over USB, reached by SSH across a USB Ethernet gadget it implements itself. The compiler compiles its own 759 functions. 3 commits.
  3. № 2
    28 Feb 26
    Nine architectures in four commits Work resumes after eleven months, and not where it stopped. A 64-bit rewrite with actors and SMP, a kernel that recompiles itself from source it carries inside, and a portable bytecode ISA with nine backends. 4 commits.
  4. № 1
    15 Mar 25
    A quick hack, on Movitz The first commit is a prototype: 29,000 lines of Modus on 55,000 lines of somebody else's bare-metal Lisp, booting under QEMU into a REPL with TLS and SSH. It was built in silence, shelved for eleven months, and its date hides a fortnight of work that happened in 2026. 1 commit.

The full archive — every issue back to March 2025 →

notes

Longer pieces

  1. note
    30 Aug 26
    The floor does not compound Twenty-six weeks, measured. Output peaked in July and has halved since, which is not a slowdown — and the one repository that never accelerated is the one underneath all the others.
three claims, and where to check them

How it is built

for machines

The same archive, without the page

Legibility is the argument this project makes about software, so it would be strange to make the archive itself awkward to read. Every issue has a Markdown mirror at its own address with index.md on the end — same text, no chrome. The rest is where a machine would look for it:

None of it is written by hand. bin/mirror reads the site's own HTML back and regenerates the lot, so the mirrors cannot drift from the pages they mirror; bin/mirror --check fails if they have.

42 repositories, one machine

The workspace

Each piece is a library in its own right, clean-room and in portable Common Lisp, and each is used by something else here rather than written to be admired. They are grouped by what they are for; the dependencies run mostly downward, and occasionally sideways in ways worth noticing — the B-tree under the Bitcoin node is also the B-tree under the filesystem that a git repository lives in.

The machine

modus
A bare-metal Lisp operating system. Boots on hardware or QEMU into a REPL with networking, SSH and crypto, on a portable VM targeting nine architectures.

Desktop

kiln
The whole workspace fired into a container image — a Lisp personal computer you can start with one command.
glass
A framebuffer, a window manager and a from-scratch VNC/RFB server.
glass-sdl
A glass desktop in a native window. The one place in the workspace that binds a C library, on purpose.
glass-mcclim
McCLIM support kept outside glass, so glass need not know McCLIM exists.
warp
A delta protocol rather than a renderer: keyed, budgeted, staleness-annotated updates over typed projections, with a separate encoding per consumer. A browser's DOM and a stream of tokens are peer encodings; neither is privileged.
warren
A Finder-style Miller-column file browser.
loom
The browser shell that drives the weft engine.
spool
A podcast client — feeds over weft, audio through reed.

Text, graphics & the web

scribe
First-class text rendering: sfnt/WOFF2, CFF, variable fonts, hinting, colour emoji, script fallback.
weft
A web rendering engine — HTML and CSS parsing, layout, paint.
shuttle
A JavaScript engine: source to bytecode to a VM, clean-room.
gesso
2D vector graphics — affine transforms, paths, fills, strokes.
stencil
An SVG parser and renderer.
pigment
Image codecs: PNG, GIF, JPEG, WebP, SVG and data: URIs.
folio
A PDF parser and renderer.
reed
Audio codecs — decoders for the formats a podcast arrives in.
webp-pure
A standalone WebP/VP8 decoder to RGB. pigment reaches for it; it stands alone because a video codec's key-frame path is worth having on its own.

Sound & tensors

mill
A tensor engine and neural-graph interpreter, extracted from chord once it became clear the engine was not about speech.
chord
Text to speech — an ONNX graph interpreter running on mill.
stave
A streaming Zipformer speech recognizer.

Network & crypto

seal
A clean-room TLS 1.3 and 1.2 client, and since August the workspace's one HTTP and WebSocket client — it absorbed four hand-rolled ones, including the last library here that was reaching for OpenSSL.
natrium
Constant-time crypto: the NaCl/libsodium surface, dependency-free.
secp256k1-fast
secp256k1, ECDSA and BIP-340 Schnorr, with its own SHA-256 and HMAC.
conch
An SSH-2 client: curve25519 KEX, ed25519, channels.
cl-tor
A Tor client — ntor circuits, directory validation.
cl-transport
One outbound dial: direct, SOCKS5, or through a pluggable transport.
cl-frpc
An frp reverse-proxy client, so a machine behind NAT can be reached.
cl-nostr
A Nostr client — how a session tells you it is up.
webrtc-data
A WebRTC data-channel peer: SDP, ICE, DTLS, SCTP.
webrtc-media
The media plane — SRTP/SRTCP, RTP framing, G.711, a VP8 encoder.

Storage & formats

pagetree
A copy-on-write B+tree key/value store — crash-safe, no mmap. The substrate under both the Bitcoin node's UTXO set and the filesystem below.
cabinet
A hierarchical filesystem — inodes, directories and contents in one pagetree keyspace. It exists so that things which expect a filesystem can run where there is no filesystem.
cairn
git from scratch — object model, packfiles, index, merge, and both transports, validated against real git. It can keep a repository inside a cabinet, which is how kiln clones this whole organisation with no git binary in the image.
dist
A self-hosted Quicklisp distribution for these libraries.
cram
DEFLATE and zlib, with Z_SYNC_FLUSH for streaming. The workspace's compression: scribe, glass, pigment and cairn all dropped third-party codecs for it.
zstd-pure
Zstandard, compressor and decompressor.
brotli-pure
Brotli, the whole of RFC 7932 — which is what WOFF2 fonts arrive in.

Agents & applications

operandi
A Lisp-native ReAct agent loop, local or hosted.
operandi-gui
That agent as a warp app: a chat window, standalone or phone-reachable.
skep
An agent workspace over Nostr, interoperable with an existing agent protocol and proven against its real client rather than a mock.
cl-consensus
A clean-room Bitcoin consensus engine and full node.