<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Malte Therkildsen · Writing</title>
  <link href="https://therkildsen.dev/writing"/>
  <link rel="self" href="https://therkildsen.dev/writing/feed.xml"/>
  <id>https://therkildsen.dev/notes</id>
  <updated>2026-10-15T00:00:00Z</updated>
  <author><name>Malte Therkildsen</name></author>
  <entry>
    <title>Spark, a JavaScript engine held against Ecma’s tests</title>
    <link href="https://therkildsen.dev/writing/spark"/>
    <id>https://therkildsen.dev/notes/spark</id>
    <updated>2026-10-15T00:00:00Z</updated>
    <summary>Spark, a JavaScript engine I wrote from nothing, runs Ecma’s conformance suite, and a sample of it runs in the page. Open any test, change it and run it again.</summary>
    <category term="software" label="Software"/>
  </entry>
  <entry>
    <title>Matching LibreOffice to the fifteenth digit</title>
    <link href="https://therkildsen.dev/writing/digits"/>
    <id>https://therkildsen.dev/notes/digits</id>
    <updated>2026-10-15T00:00:00Z</updated>
    <summary>P33’s spreadsheet matches LibreOffice in every cell of its corpus to all fifteen digits, because two files compute logarithms, powers and a fused multiply-add exactly with BigInt. Switch them off in the page to see which cells differ.</summary>
    <category term="notes" label="Notes"/>
  </entry>
  <entry>
    <title>Asymptote, figures drawn by the build and redrawn in the page</title>
    <link href="https://therkildsen.dev/writing/asymptote"/>
    <id>https://therkildsen.dev/notes/asymptote</id>
    <updated>2026-10-11T00:00:00Z</updated>
    <summary>The engine behind RAMTT’s articles draws each chart from a data file into the page before any script runs, and redraws it with the same function. Move the sliders of an explorable figure written in its own small language.</summary>
    <category term="notes" label="Notes"/>
  </entry>
  <entry>
    <title>Quire, a PDF reader written from nothing</title>
    <link href="https://therkildsen.dev/writing/quire"/>
    <id>https://therkildsen.dev/notes/quire</id>
    <updated>2026-10-08T00:00:00Z</updated>
    <summary>The file, its objects, its filters and its fonts, and every page drawn on a canvas an operator at a time. It reads the text of pdf.js’s own test files, and every page is held against pdf.js.</summary>
    <category term="notes" label="Notes"/>
  </entry>
  <entry>
    <title>Crank, a WebAssembly interpreter written from nothing</title>
    <link href="https://therkildsen.dev/writing/crank"/>
    <id>https://therkildsen.dev/notes/crank</id>
    <updated>2026-10-08T00:00:00Z</updated>
    <summary>The binary format, validation and every instruction of the standard but its vectors, run one step at a time in plain JavaScript. It passes the official test suite, and every result is held against your browser.</summary>
    <category term="notes" label="Notes"/>
  </entry>
  <entry>
    <title>Glyph, a font renderer written from nothing</title>
    <link href="https://therkildsen.dev/writing/glyph"/>
    <id>https://therkildsen.dev/notes/glyph</id>
    <updated>2026-10-08T00:00:00Z</updated>
    <summary>TrueType outlines, variable axes and a rasterizer, reading the font this site is set in. Every line in the page is drawn twice, by Glyph and by your browser, with where they differ.</summary>
    <category term="notes" label="Notes"/>
  </entry>
  <entry>
    <title>Thaw, a PNG decoder written from nothing</title>
    <link href="https://therkildsen.dev/writing/thaw"/>
    <id>https://therkildsen.dev/notes/thaw</id>
    <updated>2026-10-08T00:00:00Z</updated>
    <summary>DEFLATE, zlib and PNG from the specifications, held against zlib and against Chromium pixel for pixel. Every image in the page is decoded twice, by Thaw and by your browser.</summary>
    <category term="notes" label="Notes"/>
  </entry>
  <entry>
    <title>Comb, a regex engine that never backtracks</title>
    <link href="https://therkildsen.dev/writing/comb"/>
    <id>https://therkildsen.dev/notes/comb</id>
    <updated>2026-10-08T00:00:00Z</updated>
    <summary>Regular expressions written from nothing, with the same answers as the browser’s RegExp and time that grows only in step with the text. Race it against your browser on the pattern that stops one.</summary>
    <category term="notes" label="Notes"/>
  </entry>
  <entry>
    <title>Weft, a text that stays one text when nobody is online</title>
    <link href="https://therkildsen.dev/writing/weft"/>
    <id>https://therkildsen.dev/notes/weft</id>
    <updated>2026-10-06T00:00:00Z</updated>
    <summary>Weft is a CRDT for text, written from nothing. Type in three copies, cut one off the network, keep typing, and watch them agree again. A fuzzer in the page checks it across thousands of random sessions.</summary>
    <category term="notes" label="Notes"/>
  </entry>
  <entry>
    <title>Gambit, a chess engine written from nothing</title>
    <link href="https://therkildsen.dev/writing/gambit"/>
    <id>https://therkildsen.dev/notes/gambit</id>
    <updated>2026-10-06T00:00:00Z</updated>
    <summary>A board, every legal move and a search, in one file with no dependencies. Play it in the page, and count its moves against the published perft tables in your browser.</summary>
    <category term="notes" label="Notes"/>
  </entry>
</feed>
