Skip to content

[ The setup ]

Uses.

What the work is actually made with, and the habits that turned out to be load-bearing. Everything here is in use on something shipped — most entries link to the thing that proves it. Nothing is listed because it would look good on a list.

Building the web

What the sites and platforms here are made of.

Next.js + TypeScript

see it →

The App Router, static wherever a page can be static. This site is the example — every route you have opened was prerendered as HTML before a line of JavaScript ran.

React

For the parts that genuinely need state — the booking flow, the scoping wizard, the assistant. Everything else stays a server component so it costs the visitor nothing.

Tailwind CSS

Used where a design system earns it. Much of this site is deliberate inline styling instead, because one-off compositions do not benefit from a utility layer.

Vercel

Deploys by CLI, static output, image optimisation. Chosen because the framework and the platform being the same removes a category of problem.

WordPress

The deepest practice, and the tools that make it repeatable.

WordPress + WooCommerce

see it →

Plugin development, deep customisation and commerce built into the same install as the services — the pattern behind the clinic build.

Elementor Pro

see it →

On builds where a non-technical team will keep restyling the site. Chosen deliberately, with the licence and the lock-in accounted for.

Own plugins

see it →

Six of them, all free to download — page speed, Elementor animation, link management, prescriptions into a WooCommerce cart.

Own rescue tooling

see it →

A forensic analyser and a Playwright utility that rebuilds a whole site from a backup archive. Both written because the manual version kept costing days.

Data and backend

Where the state lives.

Supabase / PostgreSQL

see it →

Relational by default, with row-level security so the access rules sit with the data rather than in application code that has to remember.

Node.js

see it →

The pipelines and scrapers behind the AI work — the YouTube back-catalogue scorer runs on it.

PHP

Because plugins are PHP, and pretending otherwise is how people ship WordPress code they cannot maintain.

Resend

Transactional email over plain fetch, no SDK. One POST does not justify a dependency and a supply chain.

AI and automation

The layer that removes the repeated work.

Claude, via the Anthropic SDK

see it →

The model behind the transcript, archive and relevance-scoring systems in the work here.

Retrieval and vector search

see it →

Chosen over fine-tuning almost every time, because facts change and answers have to be attributable to a source.

For the connective automation where a workflow tool is genuinely the right answer, self-hosted when the data should not leave.

Claude Code

Agentic development as part of the actual workflow rather than an experiment — including on this site.

How the work runs

Habits that are load-bearing, not preferences.

The build is the check

No dev server in this workflow. Changes are built, deployed and verified on a real URL, because a thing that only works locally has not been tested.

Push and deploy in parallel

Every ship is both, because the repository and the live site drifting apart is a silent failure.

Zero legacy

Superseded code, stale docs and dead files get deleted rather than left. Several components and a whole route have been removed from this site for exactly that reason.

No claim without proof

Counts derive from the content files, case studies link to live sites, and anything that cannot be backed one click away does not ship.

Missing from this list on purpose: hardware, editor and desk. They are not written down because they have not been asked about — and a page like this is only worth reading while everything on it is true. If you want to know what I would use for something specific, ask.

Want this stack behind your own build? Let's talk.

Start a project ↗