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.
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.jsonsays. - 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.
-
Inter
Everything that is read, which is the headings, the text, the buttons and the large figures. It is one variable face, set light at large sizes and regular for text, with the letters drawn closer as the size grows. It has an upright and an italic.
- Holder
- The Inter Project Authors
- Files
- 2 files, 66.1 kB
- Source
- github.com/
rsms/ inter
-
JetBrains Mono
Text that a machine reads or writes, such as a hash, a line of code, a file name, a clause number or the date of a record, and the small capitals that name a part of a page.
- Holder
- The JetBrains Mono Project Authors
- Files
- 1 file, 28.7 kB
-
STIX Two Math
The symbols that the other two do not hold, such as Greek letters. Loaded only by a page that needs one.
- Holder
- The STIX Fonts Project Authors
- Files
- 1 file, 127.9 kB
- Source
- github.com/
stipub/ stixfonts
-
Archivo
The name of the site. Its extended capitals are traced into a path, so that the name is the same in a tab, in a picture and on a page that has not loaded a face, and no page asks for the font.
- Holder
- The Archivo Project Authors
- Files
- None. It is a path.
The scale
-
--t-30.75rem -
--t-20.8125rem -
--t-10.875rem -
--t01rem -
--t11.1875rem -
--t2clamp(1.3rem, 1.12rem + 0.55vw, 1.75rem) -
--t-statementclamp(calc(min(1.25rem, 8vw) * var(--fit, 1)), calc((1.05rem + 0.9vw) * var(--fit, 1)), calc(min(2rem, 9vw) * var(--fit, 1))) -
--t-titleclamp(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))) -
--t-heroclamp(calc(min(2.4rem, 12vw) * var(--fit, 1)), calc((1.3rem + 3.1vw) * var(--fit, 1)), calc(min(4rem, 13vw) * var(--fit, 1))) -
--t-posterclamp(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.