Four disciplines, each shown as a leaflet folded in three. Drag one open sideways or click it to see three live examples.
How a project runs
Every project follows 4 steps
The quality bar is set before the first line of code and checked before anyone else sees the work.
What it leaves
What a project delivers
The working product, the components it is built from and the measurements it was checked against, so the next change can be compared with the last.
Running workThe thing itself, in the browser, in light and dark, at phone and desktop widths
The partsThe tokens and components it is made of, each documented where it runs
The measuresSizes, colors and timings read in the browser, to check again after every change
A handoverThe order to build it in, and the numbers to compare against
How I build
The tools and checks behind every app
If you have a technical team, the chapters from here show them the tools and checks behind every app on this site, the work in numbers, and the command that counted each one.
The app saves each change on the device first and syncs it when a connection is available, so people can keep working without a network.
The databaseSQLite in the browser, stored in OPFS and synced to Postgres with PowerSync (ramtt.app).
The documentYjs documents in IndexedDB, merged character by character, with a server that stores the updates.
The app itselfA service worker that caches the app, so it opens without a network.
The stack
The front end and the back end
The front end
ReactReact with TanStack Router for apps, built with Vite.
vinextvinext on Vite and Cloudflare Workers, prerendered, for a site in two languages.
JavaScriptPlain JavaScript and esbuild where a page needs no framework, as on this site.
CSSPlain CSS on design tokens, with a linter and a check that measures every component on a rendered page.
The back end
WorkersCloudflare Workers, Durable Objects with SQLite, and WebSockets.
PostgresSupabase with Postgres and row-level security, with 109 migrations in RAMTT.
Sign inPasskeys verified on the server, and Web Crypto for encryption and signatures in the browser.
ServicesStripe with a verified webhook, Resend for email, and Claude through the Anthropic SDK.
Every change
Automated checks
A quick set of checks runs at every commit, and the full set runs on a build server for every pull request. A change that fails either is not merged.
The prototypes and this site pass 566 browser tests in Chromium. A second check compares 48,250 rendered values on 117 of their pages with the design system’s specification.
AuditsThe JavaScript size of each route, secrets in a change, the colors of the design tokens and the text users see.
Browser scriptsScripts that click and type through a page and measure it.
WritingA writing check of every text in RAMTT at each commit, and of every page of this site at each build.
Working with Claude
I write code with Claude, Anthropic’s SI model.
Its changes go through the same checks, browser tests and writing check as mine. The commands at the end of this page count every number on this site.
Numbers
The work in numbers
From 25 Jan 2026 to 11 Oct 2026 I made 9,057 commits in 15 repositories, on 214 of 260 days. The longest run of days with a commit is 67 days, and it runs to the last commit. 988 pull requests were merged.
The year, day by day
Drag along the days or throw them. The count is every commit up to the day under the needle. The busiest day was 5 Oct 2026, with 524 commits.
Around the clock
3,565 of the 9,057 commits were made between midnight and six in the morning, Copenhagen time.
Turn the hand, or use the arrow keys, to read any hour. Each bar is every commit made in that hour, on every day of the period.
On one scale
The rest of the counts stand on one logarithmic tape. Pull it under the needle; it stops at each number.
The face, the colors and the weight of this page. Every value is read from the page while you look at it, or from the file named beside it.
One face, and its sizes
Inter Variable, served by the site and cut to the Latin letters and the weights the design draws. Each size is measured on this page, at this screen.
Day and night, one set of names
The tokens are read from the design system’s stylesheet as you look. Drag the seam: day on one side, night on the other. Click a color to copy its name.
An earlier front page, line by line
The markup of the site’s earlier front page, web/home/markup.html, with the commit that last changed each line. Loom, the Git I wrote from nothing, replays the same commits here and blames the file again.
What this page weighs
Measured by your browser while the page is open, with the interface that measured each value printed under it.
Sources
The command behind each number
The site runs these commands when it is built. They last ran on 11 Oct 2026. Find one by what it counts or by what it runs, copy it, or replay what it printed.
Commits
Each repository’s commits are read from every branch of its local copy, or from the GitHub API when it is only there. A commit is counted once, in the first repository that holds it, by its time and subject. Bots are left out, and the times are counted in Copenhagen time.
The command for tests of the language’s official suite that Spark passes
python3 -c "import json;t=json.load(open('prototypes/p39-spark/test262/summary.json'))['totals'];print(sum(x['pass'] for x in t.values()), sum(x['fail'] for x in t.values()))"
Tests of the language’s official suite that Spark fails
The command for tests of the language’s official suite that Spark fails
python3 -c "import json;t=json.load(open('prototypes/p39-spark/test262/summary.json'))['totals'];print(sum(x['pass'] for x in t.values()), sum(x['fail'] for x in t.values()))"
No command matches. Try a repository’s name, or a tool such as git or gh.
How the totals add up
The totals are not counted by a command of their own. They are added up from the counts of each repository. Point at a number to see what it is made from; click it to read its source.
Rebuilding the site
The first command runs every command above and writes the numbers. The second builds the pages from them.
The commands that build the site
node site/collect.mjs
cd web && npm run build
Colophon
How the site is set and served
Set in Inter Variable, kept on the site’s own server and cut to the letters a Latin page uses and the weights from regular to bold, with the optical size kept. In the notes, Galley, the layout engine in the Lab, chooses the line breaks of each paragraph as TeX does and hyphenates with TeX’s patterns.
Built with vinext on Vite, rendered to HTML when the site is built, and served by a Cloudflare Worker at therkildsen.dev. The prototypes run on a second Worker at therkildsen.dev/lab, where a Durable Object with SQLite keeps their data and the contact form’s messages.
A service worker keeps every page on the device, so the site opens without a network, and a message written offline waits there until it can be sent.
The pages are drawn in the RAMTT design system: its tokens, its components and the site’s parts built from them.