Colophon

How this site is made

Pages are built ahead of time and served from the edge. One small library reaches the browser. The numbers on the plates are computed by the code that the engines run, and the whole site can be rebuilt from a commit.

See the build What is real

Build

One commit, one site

The address of the build is in the footer of every page. It names the commit that the pages came from, and the date of that commit, not the date of the build, so building the same commit again does not change it.

This build

Commit
fb641aaf
Committed
Built with
Astro 7.4.4, with the Cloudflare adapter 14.4.3.
Node
>=22.23.4, as package.json says.
Installed from
The lockfile, with npm ci.

To rebuild it

git checkout fb641aaf
npm ci
npm run build

The output is a folder of files and a Worker. Building the same commit again in the same folder, with the same versions from the lockfile, gives the same files, byte for byte. In a folder with another path the pages are the same apart from an id that Astro gives to each interactive part, and the Worker holds the path that it was built in. scripts/qa/reproduce.mjs builds a commit in clean clones and compares the files.

Parts

What it is built from

These are the direct dependencies, with the versions that the lockfile installs. A browser receives Preact and our own code and nothing else. The calculation kernel has no dependencies at all.

In the browser

Package Version Licence What it does here
@astrojs/preact 6.1.1 MIT Connects Preact to the pages.
preact 11.1.0 MIT Draws the plates that you can change, and the receipt check.

In the Worker

Package Version Licence What it does here
@astrojs/cloudflare 14.4.3 MIT Runs the site on Cloudflare Workers, with D1 and R2.
valibot 1.5.0 MIT Checks what the contact form and the receipt check receive.

At build and in tests

Package Version Licence What it does here
@astrojs/check 0.9.12 MIT Type checks the pages.
@astrojs/markdown-remark 7.3.5 MIT Reads the front matter of essays and pages.
@astrojs/markdown-satteri 0.4.6 MIT Turns Markdown into pages.
@axe-core/playwright 4.14.0 MPL-2.0 Scans every page for accessibility faults.
@fontsource-variable/archivo 5.3.0 OFL-1.1 The source of the face that the name of the site is traced from. It is not served.
@fontsource-variable/inter 5.3.0 OFL-1.1 The source of the Inter files, upright and italic.
@fontsource-variable/jetbrains-mono 5.3.0 OFL-1.1 The source of the JetBrains Mono file.
@fontsource/stix-two-math 5.3.0 OFL-1.1 The source of the STIX Two Math file.
@types/node 22.20.5 MIT Types for the scripts that build and check.
astro 7.4.4 MIT Builds the pages.
fast-check 4.10.2 MIT Makes the inputs for the property tests.
github-slugger 2.0.0 ISC Makes the same heading anchors in the pages and in the tests.
playwright 1.64.1 Apache-2.0 Drives Chromium, Firefox and WebKit for the parity check and the screenshots.
satteri 0.10.5 MIT The Markdown processor under it.
sharp 0.35.5 Apache-2.0 Draws the icons, and reduces the pictures that links show to a small palette.
shiki 4.5.0 MIT Colours code blocks while the site is built.
temml 0.14.0 MIT Draws mathematics as MathML while the site is built.
typescript 6.0.3 Apache-2.0 Type checks every file.
vitest 5.0.5 MIT Runs the tests.
wrangler 4.156.0 MIT OR Apache-2.0 Runs the Worker on this machine, with D1 and R2.
z3-solver 5.3.3 MIT Checks the proofs. A second solver checks them again.

Type

Four typefaces, all open

Three are served from this site, as files that you can see in your browser's network panel, and none is requested from another company. The fourth is traced into the name of the site and is not served at all. The licence text of each is linked.

The scale

  1. --t-3 0.75rem
  2. --t-2 0.8125rem
  3. --t-1 0.875rem
  4. --t0 1rem
  5. --t1 1.1875rem
  6. --t2 clamp(1.3rem, 1.12rem + 0.55vw, 1.75rem)
  7. --t-statement clamp(calc(min(1.25rem, 8vw) * var(--fit, 1)), calc((1.05rem + 0.9vw) * var(--fit, 1)), calc(min(2rem, 9vw) * var(--fit, 1)))
  8. --t-title clamp(calc(min(1.85rem, 9.5vw) * var(--fit, 1)), calc((1.2rem + 1.9vw) * var(--fit, 1)), calc(min(2.9rem, 9vw) * var(--fit, 1)))
  9. --t-hero clamp(calc(min(2.4rem, 12vw) * var(--fit, 1)), calc((1.3rem + 3.1vw) * var(--fit, 1)), calc(min(4rem, 13vw) * var(--fit, 1)))
  10. --t-poster clamp(calc(min(2.6rem, 12vw) * var(--fit, 1)), calc((1.6rem + 3.9vw) * var(--fit, 1)), calc(min(5.25rem, 14vw) * var(--fit, 1)))

Colour

One blue and one orange

The page is a white leaf on a field of one saturated blue. A block that has to stand out is a flat panel of the blue, of the pale wash of it or of the orange, and everything else is drawn in the blue and in the night. The orange is for what is small and has to be found, a full stop, a crosshair or a tag, and is never the colour of words on white. No colour stands for a kind of page or a kind of product. Every pair of colours that the site sets against each other is held to a minimum contrast by a test that reads the style sheet.

Six grounds

  • Leaf #FFFFFF The leaf that the page is on: white.
  • Sheet #FFFFFF A sheet: anything that carries a figure, a table or a field, and the ink on the blue.
  • Wash #ECF3FF The pale blue of a panel that is read, of the head of a table and of a band within a sheet.
  • Blue #2455F6 The electric blue of the field, of the panels and of the button. White on it is 5.67 to 1.
  • Night #121A30 The ink. Text and headings, the ground of a block of code, and the word on a button that sits on the orange. It is a blue-black.
  • Orange #FF8F5A The orange as a ground, for a tag and for the panel that closes a page, with the night set on it.

The inks and the marks

  • The link #1C40D6 The ink of a link and of the words that are the blue on a ground that is light, and the blue under the pointer on a button.
  • The lesser ink #37425F Text of lesser weight on the leaf and on a sheet, such as a summary.
  • The dot #E04F1A The dot of the mark: the one warm colour of the site, for what is small and has to be found, and never for words on white.
  • The highlighter #FFE6D9 The orange as a pale ground: the highlighter, for the one thing on a page that is being pointed at.
  • A check that passed #27603B A check that passed, on a ground that is light. Always beside a word.
  • A limit #8A5200 A limit to read before relying on something. Always beside a word.
  • An error #9A322A An error that the reader has to fix, on a ground that is light. The dark has its own, lifted. Always beside a word.

All 71 pairs reach their minimum. The closest is blue/fg-2 on blue/bg at 4.62 to 1, against a minimum of 4.5. Text needs 4.5 to 1. A mark, a field edge or a focus ring needs 3 to 1.

Every pair, with its ratio
Use Colour Ground Ratio Needs
Text on paper paper/fg #121a30 paper/bg #ffffff 17.27 4.5
Lesser text on paper paper/fg-2 #37425f paper/bg #ffffff 9.97 4.5
Text on white white/fg #121a30 white/bg #ffffff 17.27 4.5
Lesser text on white white/fg-2 #37425f white/bg #ffffff 9.97 4.5
Text on wash wash/fg #121a30 wash/bg #ecf3ff 15.48 4.5
Lesser text on wash wash/fg-2 #37425f wash/bg #ecf3ff 8.94 4.5
Text on blue blue/fg #ffffff blue/bg #2455f6 5.67 4.5
Lesser text on blue blue/fg-2 #dfe8ff blue/bg #2455f6 4.62 4.5
Text on signal signal/fg #121a30 signal/bg #ff8f5a 7.67 4.5
Lesser text on signal signal/fg-2 #1a2440 signal/bg #ff8f5a 6.81 4.5
Captions and labels smoke #5a6584 paper #ffffff 5.79 4.5
Captions and labels smoke #5a6584 white #ffffff 5.79 4.5
Captions and labels smoke #5a6584 wash #ecf3ff 5.19 4.5
Captions, heads of columns and dates ink-3 #4a5675 paper #ffffff 7.29 4.5
Captions, heads of columns and dates ink-3 #4a5675 white #ffffff 7.29 4.5
Captions, heads of columns and dates ink-3 #4a5675 wash #ecf3ff 6.54 4.5
The caption of a block of code ash #d3dbee night #121a30 12.45 4.5
The pale line of a statement on the blue, which is large text mist #c4d3ff blue #2455f6 3.81 3
A button, on a ground that is light paper/btn-fg #ffffff paper/btn-bg #2455f6 5.67 4.5
A button, on a ground that is light, under the pointer paper/btn-hover-fg #ffffff paper/btn-hover #1c40d6 7.63 4.5
A button, on the blue blue/btn-fg #2455f6 blue/btn-bg #ffffff 5.67 4.5
A button, on the blue, under the pointer blue/btn-hover-fg #1c40d6 blue/btn-hover #ecf3ff 6.84 4.5
A button, on the orange signal/btn-fg #ffffff signal/btn-bg #121a30 17.27 4.5
A button, on the orange, under the pointer signal/btn-hover-fg #ffffff signal/btn-hover #37425f 9.97 4.5
A button is seen on paper paper/btn-bg #2455f6 paper/bg #ffffff 5.67 3
A button is seen on white white/btn-bg #2455f6 white/bg #ffffff 5.67 3
A button is seen on wash wash/btn-bg #2455f6 wash/bg #ecf3ff 5.08 3
A button is seen on blue blue/btn-bg #ffffff blue/bg #2455f6 5.67 3
A button is seen on signal signal/btn-bg #121a30 signal/bg #ff8f5a 7.67 3
A panel of the blue is seen against the white that it is set in blue #2455f6 paper #ffffff 5.67 3
A panel of the blue is seen against the white that it is set in blue #2455f6 white #ffffff 5.67 3
A link on a sheet blue-deep #1c40d6 paper #ffffff 7.63 4.5
A link on a sheet blue-deep #1c40d6 white #ffffff 7.63 4.5
A link on a sheet blue-deep #1c40d6 wash #ecf3ff 6.84 4.5
A link on a sheet blue-deep #1c40d6 wash-2 #dce7ff 6.14 4.5
Check passed pass #27603b paper #ffffff 7.44 4.5
Check passed pass #27603b white #ffffff 7.44 4.5
Check passed pass #27603b wash #ecf3ff 6.67 4.5
Text on the highlighter night #121a30 flare-wash #ffe6d9 14.45 4.5
Limit to read warn #8a5200 paper #ffffff 6.39 4.5
Limit to read warn #8a5200 white #ffffff 6.39 4.5
Limit to read warn #8a5200 wash #ecf3ff 5.73 4.5
Error danger #9a322a paper #ffffff 7.33 4.5
Error danger #9a322a white #ffffff 7.33 4.5
Error danger #9a322a wash #ecf3ff 6.58 4.5
Error, on the blue blue/danger #ffffff blue/bg #2455f6 5.67 4.5
Check passed, on the blue blue/ok #ffffff blue/bg #2455f6 5.67 4.5
Check passed, on a block of code mint #7ecc96 night #121a30 9.02 4.5
Error, on a block of code blush #e1bbaa night #121a30 9.78 4.5
A comment in a block of code rule-2 #9aa6c4 night #121a30 7.09 4.5
A string in a block of code code-string #dac99e night #121a30 10.55 4.5
A number in a block of code code-number #a8cadd night #121a30 10.00 4.5
A type in a block of code code-type #acceb5 night #121a30 10.07 4.5
A link, on the blue blue/accent #ffffff blue/bg #2455f6 5.67 4.5
Error, on the orange signal/danger #121a30 signal/bg #ff8f5a 7.67 4.5
Accent fill and selection on-accent #ffffff blue #2455f6 5.67 4.5
Data ink, negative, which is hatched as well neg #e04f1a paper #ffffff 3.96 3
Data ink, negative, which is hatched as well neg #e04f1a white #ffffff 3.96 3
Fields, toggles and chips edge #6b7898 paper #ffffff 4.41 3
Fields, toggles and chips edge #6b7898 white #ffffff 4.41 3
Fields, toggles and chips edge #6b7898 wash #ecf3ff 3.95 3
Marks, rules and the focus ring blue #2455f6 paper #ffffff 5.67 3
Marks, rules and the focus ring blue #2455f6 white #ffffff 5.67 3
Marks, rules and the focus ring blue #2455f6 wash #ecf3ff 5.08 3
The focus ring, on the night azure #8eb9ff night #121a30 8.66 3
The focus ring, on the blue blue/focus #ffffff blue/bg #2455f6 5.67 3
The focus ring, on the orange signal/focus #121a30 signal/bg #ff8f5a 7.67 3
The dot of the mark brand #e04f1a paper #ffffff 3.96 3
The dot of the mark brand #e04f1a white #ffffff 3.96 3
The dot of the mark brand #e04f1a wash #ecf3ff 3.55 3
The dot of the mark brand #e04f1a night #121a30 4.36 3

The grounds of a section are paper, white, wash, blue and signal. Each sets its own text, its lesser text and its marks, and a component reads them from the section that it stands in.

Names

What is real, and what stands in

The work on the plates and the drawings is computed. The people, the customers and their words are written to read as real ones, and this says which is which. The only photographs on the site are the faces of the people.

What is a placeholder

Customers
No customer is named. How each is described, and its case study and the quotes in it, are invented, and stand where the real ones will be, which are described in the same way.
People
The names, roles and histories of the team are invented. The portraits are stock photographs that stand where theirs will be.
Counts
The number of customers and of countries is a placeholder. The number of tests, theorems, clauses and engines is computed from the repository.
Receipts
Every receipt, hash and result on a plate is real. It is worked out when the site is built, by the code that the engines run.

Checks

What runs before a release

These are numbers from the last run, written to files that the build reads, so the page cannot claim a count that nothing produced.

Tests
3,815 cases in 141 files. What they claim.
Proofs
38 statements, each checked by Z3 5.3.3 and cvc5 1.4.2. The files.
Parity
5 engines agree on 24 fixtures, to the last bit. The table.
Colour
71 pairs of colours, each above its minimum. The ratios.

The next step

Bring us
one book

A scoping call, a sample book and a parallel run on your data. Most teams have the first reconciled number inside two weeks, and a receipt for it on the day.

Book a demo Work out a price