How this site is built
A theme written for this site, almost no third-party requests, and the solar year under the name.
This site runs on Drupal 11 with a theme I wrote for it. There is no page builder, no front-end framework and no tracking. Everything a page needs comes from this domain, with one exception: the contact form’s spam check, which Cloudflare serves.
The year under the name
The rule under the masthead is this year in my Solar Calendar: 13 months of 28 days, with the months gone filled in and the sun on today. A year starts on the first Monday on or after the March equinox, which the page works out with Jean Meeus’s formula from Astronomical Algorithms. The same sums run in PHP to date each post in both calendars, and the CV draws each job as a line in the same style, placed between my first job and today.
Content
Every page, post, product and job is a content item with typed fields: a product has a kind, a status, a licence, the year it started, the technology it uses and its links. The CV is built from the job entries and a vocabulary of skills, so the page, the printed CV and the JSON Resume version always agree.
The content started life as Markdown files with front matter. A small import command reads them and creates or updates each item by its path, so the site can be rebuilt from an empty database with one command, and running it twice changes nothing.
This website was built, and all of its content written, by AI, so there may be inaccuracies. If you spot one, please tell me through the contact form.
Live figures from GitHub
The product pages show each repository’s latest release, last change and stars, and the home page lists the products I’ve changed most recently. Cron fetches them from the GitHub API four times a day and keeps them in the database, so a page never waits on GitHub and your browser never talks to it. If GitHub is down, the last good figures stay.
Type and colour
The headings and text are set in Libre Caslon, a revival of the English printing face of almanacs and newspapers. Dates, facts and controls are in Schibsted Grotesk, drawn for a Scandinavian news publisher. Both are self-hosted under the SIL Open Font License, so there are no requests to a font service.
The light theme is an overcast sky with night-navy ink; the dark theme is the night itself. The only bright colour is the marigold sun, which always means “now” or “here”: today on the rule, the section you’re in, a live product, the job I’m in. The site follows your system’s setting unless you pick one in the footer, and remembers the choice in your browser.
Libre Caslon Display
The name and page titles
Libre Caslon Text
Everything you read
Schibsted Grotesk
Dates, facts and controls
- Page
--page - Ink
--ink - Muted text
--muted - Rules
--rule - Links
--link - The sun
--sun
Security and privacy
The server sends a strict Content-Security-Policy that allows scripts, styles, fonts and images from this domain only, with no inline scripts. The one exception is Cloudflare Turnstile, the contact form’s spam check, whose script and frame come from Cloudflare. Pages are served over HTTPS with HSTS. The contact form is the only place that takes personal data. Turnstile tells people from bots, usually without asking you to do anything, and a hidden field catches simpler bots. Messages are emailed to me rather than kept on the site. The privacy notice lists the short-lived anti-spam records the site does keep.
Accessibility and testing
Every template is checked with axe against WCAG 2.2 AA in both themes, on a desktop and a phone. The layout works from a 320px screen up with no sideways scrolling, every control works from the keyboard, and the sun’s one movement, along the rule on your first page, is skipped if you’ve asked your system for reduced motion. The CV prints as a two-page A4 document.