Eight years ago I wrote up how I built and hosted this website. That article is still in this journal, a few entries down, and almost none of it is true any more. The site it describes has been taken apart and replaced. Same address, same name, no shared code.
This is the other half of that piece. Not a victory lap, but a like-for-like comparison, including the places where the new site is worse than the one it replaced, because a rebuild that only reports its wins is marketing.
Everything below is measured against the two builds themselves: the old theme and database as they were recovered from backup, and the new site as it comes out of the build. Where I could not measure something I have said so rather than estimated it.
What the two are made of
The 2018 site was WordPress running on a shared Linux server at AfriHost, on a theme I had adapted, with the pages assembled by PHP on every request. The 2026 site is a static build: every page is generated once, ahead of time, and what the server sends is a file. There is no database in front of a visitor, and nothing executes to produce a page they ask for.
That single difference is where most of the rest comes from.
| 2018 | 2026 | |
|---|---|---|
| Pages built | assembled per request | 44, built ahead of time |
| Rendering | PHP on shared hosting | none, just static files |
| Content lives in | a MySQL database | markdown files in git |
| Third-party requests per page | Google Tag Manager, Google Fonts | none |
| Analytics | Google Analytics via Tag Manager | none |
| Cookies set | via Tag Manager | none |
| Front-end libraries | jQuery, Modernizr, Conditionizr | none |
| Typefaces | Google’s CDN, plus 841 KB local | self-hosted, 124 KB on a normal page |
| CDN | Cloudflare | Cloudflare |
Where it got better
Nothing is fetched from anyone else. The old site loaded a Google Tag Manager container and its
typefaces from fonts.googleapis.com. Both are requests to a third party that happen whether or not
the visitor has any interest in being counted. I checked the new build the honest way: by looking
for external addresses in src and href attributes on tags that actually fetch something, rather
than counting links in the prose. There are none. Every external address on this site is a link
in a sentence that you have to choose to click.
That matters more than it did in 2018. In January 2022 a Munich court held that loading Google Fonts from Google’s CDN transferred the visitor’s IP address without consent and breached the GDPR, awarding damages on the reasoning that the operator could simply have served the font files from their own server (opens in a new tab) (LG München I, Az. 3 O 17493/20). I was not thinking about any of that when I linked Google Fonts into the old theme. I was thinking that it was one line and it worked.
The front-end libraries are gone. The old theme carried jQuery, Modernizr 2.7.1 and Conditionizr
4.3.0: roughly 16 KB of feature-detection and compatibility shims before any of my own code ran.
None of it is here. Some of that is discipline and some of it is simply that the browser caught up:
the LazyLoad script I was pleased to have added in 2018 is now a
loading="lazy" attribute (opens in a new tab)
that browsers implement themselves.
The writing is in files now, not in a database. These four old articles had to be recovered by
parsing a mysqldump out of a backup archive. They came back intact, but only because that backup
existed and someone went looking. The new site keeps every piece of writing as a markdown file in
version control, which means the content is readable without the software that renders it. This
article is a file. So is the one it is about, now.
The measurement I used to chase does not exist any more. In 2018 I was optimising for a single composite PageSpeed score. That tool is now built on Lighthouse, and the numbers that count are the Core Web Vitals (loading, interactivity and visual stability), which Google made ranking signals in 2020 (opens in a new tab) and rolled into search ranking the following year. Three specific measurements of what a visitor actually experiences replaced one number I could game.
Where it missed the mark
The build ships 2.7 MB of fonts nobody sees. This is the worst thing I found while writing this article, and I found it because I went looking for a number to boast with. While choosing typefaces I built a comparison page holding every candidate: Bricolage Grotesque, Big Shoulders, Rajdhani, Noto Sans, Zen Dots and eight others. All of them are still in the build. The font directory is 3.5 MB, and only about 800 KB of that belongs to the site; the remaining 2.7 MB exists to serve one internal comparison page. A visitor to an ordinary page does not download it, so it does not slow anything down, but it is shipped, and it is exactly the kind of thing the 2018 article would have caught, because in 2018 I was actually measuring.
Update, 25 August 2026: fixed. The comparison page and the three others like it are workbenches. They exist so a decision could be made by looking at something, and every one of those decisions is made. They are now stripped out at build time and kept on the local dev server, where they are the only place anyone would want them. The font directory went from 3.5 MB to 756 KB. One correction to the paragraph above while I am here: I counted twelve unused families and there were eleven. Red Hat Display is on that list and should not be. It is Millowall’s own typeface and its page is set in it. I would have deleted it.
There is no analytics, so I cannot tell you if any of this worked. The old site had Google Analytics and could answer “did anyone read this”. The new one answers “was anybody tracked” instead, and the answer is no. That is a deliberate trade and I would make it again, but it is a trade and not a free win. The 2018 article’s entire goal was measurable traffic. I have replaced the measurement with a principle, and I should be honest that a principle does not tell you whether anyone came.
There is no contact form. The old site had one, in PHP, and getting it working was half of the 2018 article. This site offers an email address instead. For a visitor on a phone who does not have mail configured, that is worse, and “we removed the form” is not an improvement just because the form was annoying to build.
It is not deployed yet. The 2018 piece ends with a site that is live, indexed and being crawled. This one ends with a build on my own machine. Whatever else is better about it, the old site cleared a bar this one has not cleared yet.
The stylesheet is not small. 72 KB of CSS across five files, for a site of 44 pages with no component framework in it. I have not gone through it, and I am naming it here so that I have to.
Update, 25 August 2026: 40 KB across three files, for 40 pages. I did not go through it. Two of those five files were the workbenches’ own, and they left with the fonts above. So this number got better by accident rather than by the effort I said it needed, and the paragraph stands.
What held up
One thing, and it is the thing I described most vaguely at the time: Cloudflare. In 2018 I put it in front of a struggling shared server to paper over the limitations, and wrote a paragraph about it that does not really explain what it does. It is still here, and it is now the whole host rather than a patch over one. Of every tool named in that article, it is the only one I have not had to undo.
The rest is a fair record of someone learning in public. I would rather keep it up, with this attached, than quietly delete the parts that turned out wrong.
Written with AI assistance, which is also new since 2018, and which is described on the About page.