This blog has been running since 2007 and has moved platform more times than I care to admit. The last move, onto Hugo with the cleanwhite theme, got the content out of a database and into markdown, which was the important bit. Everything after that stayed on the list of things I’d get around to eventually. I’ve had that list for years: Restructure the content; sort out the taxonomy, which had never really been a taxonomy; group the posts that are obviously part of a series into an actual series; give posts something better than a single stock header image; put analytics back, properly, bearing in mind that we have laws in the UK and Europe about tracking cookies.
The thing is, nearly twenty of years of posts, being CEO of Zure (which let’s face it, is never 9-5!), and lots of other stuff prevented me getting it done. But I figured it was time to be less of an AI curmudgeon and see if I could use it to just get this done.
Over a couple of weekends I rebuilt the site from scratch on the Blowfish theme, with Claude Code doing the work as I gave it careful instruction, and got through the entire list. This post is the first of a few about that: what the archive actually needed, where the assistant earned its keep, and where it got things wrong. I’ll come back to the analytics and to the skills I’ve built for maintaining the site in separate posts, because both deserve more than a paragraph.
This series is an experiment: I struggle to find time to blog these days, but I am very much not a fan of AI generated content. I’ve worked with Claude to create skills to help with that. So this series is a collaboration with Claude doing the research and helping me draft the posts, with me then reviewing and editing. Hopefully the skills mean that the writing style is close to my own. Let’s see how it turns out.
The archive was worse than I thought#
Starting again with a new theme meant looking properly at what I was importing, and the first thing that fell out was that my tags weren’t tags. Dragging content over several blogging platforms across those 20 years hadn’t done me any favours.
Three of them - opinion, technical-tips and general-interest - covered 213 of the 236 posts between them. They don’t describe what a post is about. They describe what kind of post it is. Meanwhile the categories taxonomy was configured in Hugo, wired into the theme, and completely empty. I’d been using one namespace to do two jobs for a decade and a half.
So the type tags became categories, one per post: How-to, Events, General, Opinion, Reviews. Events wasn’t in my original plan, and it turned out to be necessary. Without it, the speaking announcements and the conference write-ups scattered across the other four and 64 posts had no sensible category at all. That’s the sort of thing you only find by running the classification over the whole archive and looking at what’s left over.
The tags then got a pass of their own: 106 down to 99. windows-azure folded into azure, azure-resource-templates into azure-resource-manager, a couple of abbreviation duplicates merged, and a forefont typo I’d apparently been reproducing faithfully for years. Versioned tags now carry a parent, so sharepoint returns 38 posts rather than 21.
The series were the nicest fix. I’d written plenty of multi-part runs and never marked any of them up. The ten TechEd EMEA IT 2008 posts had never grouped because I’d spelled the slug two different ways across the week. The “Creating Azure Virtual Networks” series began at Part 2, because Part 1’s title doesn’t have a number in it. Both of those are the kind of thing that is obvious the moment someone lists them side by side and invisible for seventeen years otherwise.
Going through all my existing content was a task I never would have completed myself. Trying to sort all those posts and build a taxonomy is something I know that I would have just put back on the ’too hard’ pile. AI excels at that kind of thing, but you need to make sure you give it clear instructions. For the most part, figuring out the work was a discussion between myself and Claude. I did make use of a more spec-driven approach for certain tasks, but in the beginning it was very much a collaborative approach and I believe that was the right one.
Where it went wrong, which is the interesting part#
Two of the Dell Mini 9 posts share a date, and two more share another, so Claude gave the seven posts in those series a weight to force them into order. It worked: The series navigation read correctly. The trouble was, the home page then started listing three posts from 2008 as my most recent content.
A bit of digging showed that Hugo sorts pages by weight first and date second, and a weighted page outranks every unweighted one on the site, meaning that seven posts from 2008 appeared ahead of everything I’d written since. No amount of fiddling with dates would have moved them, and without AI, I would have spent an inordinate amount of time messing around before working out why. Removing the weights fixed it, at the cost of the series navigation now reading newest first. That’s the trade-off the AI and I took, and it’s written down in the repo so we don’t reintroduce it.
The header images went the same way. I’d been assigning shared images by tag - one for SharePoint posts, one for server posts, one for Azure, one for talks - and applying the rules by hand, in whatever order I happened to think of them. Six SharePoint posts were showing the server image. Not because anyone had decided that, but because the server rule ran first; fifteen posts were like that across four rules.
The fix wasn’t a cleverer rule. It was noticing that there was no defined precedence, and then writing one down as an ordered list in a script, most specific first, first match wins:
speaking > bicep > sharepoint > server > azureA talk announcement stays a talk announcement whatever it’s about. A SharePoint post is about SharePoint even when it mentions Server 2008. azure is the broadest tag, so it loses to anything more specific. The script is idempotent, so adding a sixth image is now a rule in the right place rather than another sequence-dependent pass over the content. Coverage went from 199 posts on the fallback image to 115, which is still too many, but it’s a number I can now move deliberately.
URLs are the one thing you don’t get to change#
Every post carries aliases preserving its address on the old site, and every merged or renamed tag has an alias term page. That’s many years of links from other people’s blogs and search results. Points to Claude here - I should have thought of that but hadn’t, and the AI simply went ahead and sorted it for me.
Claude methodically parsed the content from my old repo and pulled it into the new structure. Every superseded taxonomy URL got checked - the three promoted type tags, both review tags, the five merges - rather than assumed.
So what did the assistant actually change#
I’m not a developer. I write Powershell scripts when needed, and I can read code, but if you ask any of the developers I’ve worked with over the years none of them would be excited about me writing C#, or Go in the case of Hugo. Having Claude allowed me to create things that would have taken me much longer to do, and some of which I just would not have bothered doing at all.
Having AI to help reinvigorate this blog was great: The tedium and time investment stopped being blockers. Deciding a category for 236 posts is 236 small judgements, none of which is interesting, and the cost of that is why the categories taxonomy sat empty for years. Being able to say “here’s the rule, here’s the precedence, apply it and show me what doesn’t fit” turned a fortnight of evenings into an afternoon, and the leftovers - the 64 posts with no category, the six SharePoint posts on the wrong image - were the actually useful output.
It’s honest about being wrong, too, which I didn’t expect to matter as much as it does. I’d written “every post has exactly one category” into the repo’s instructions as a rule. When we later built an audit script and ran it, 37 migrated posts came back carrying two or three. The instructions now say what’s true rather than what I intended, and the audit runs every time I publish.
The times it went wrong were, without exception, the times I hadn’t stated the rule. That’s a fair split of the blame.
Next in this series: the analytics, which are Microsoft Clarity and Google Analytics 4 behind a single opt-in that leaves you cookie-free until you say otherwise, and which was fiddlier than either vendor’s documentation suggests.

