Web development

Software built to be maintained, not just launched

I take projects end to end: data model, interface, deployment, handover. One person responsible for whether the whole thing works, rather than one person responsible for each part of it and nobody responsible for the seams.

Based in London, working in English and Spanish for clients in the UK, Spain and Bolivia — mostly on budgets where a recurring dollar-denominated API bill would sink the project, which shapes the technical choices more than any preference of mine does.

The service

What I build

Marketing and catalogue sites

Sites that set out what a business does, load fast on a phone on a bad connection, and can be edited by the person who runs the business. Server-rendered by default, because a site nobody can find is an expensive brochure.

Web apps with an owner-facing admin panel

Booking, scheduling and records systems where the admin view gets as much design attention as the public one. It is used standing up, in the middle of a shift, by someone who has a few seconds — and if it is awkward, the business will quietly go back to paper.

Real-time and location-aware systems

Live dispatch and tracking on PostgreSQL and PostGIS, with WebSockets for the moving parts. Where a commercial map API would bill monthly in dollars, I self-host tiles with PMTiles instead — a running cost the client can survive is part of the specification, not an optimisation afterwards.

Offline-capable tools

Service workers, a pre-cached shell and a versioned local store, so the tool keeps working when the connection does not and an update never discards existing data. Sometimes that removes the server entirely, and with it the breach, the sync and the subscription.

Bookkeeping and POS integrations

Payment, point-of-sale and ledger systems joined up so the figures reconcile without a monthly spreadsheet standing between them. This is the part most developers get structurally right and financially wrong.

Bilingual builds

English and Spanish designed in from the start — URLs, hreflang, structured data and copy written in each language rather than translated into one of them. I write both, so the Spanish is not a machine's guess at the English.

The principle

A website is not much use if the owner has to call the developer to change a price

That sentence decides most of the architecture. It is why a restaurant menu is data rather than markup, why a fixtures table is a file a volunteer can edit rather than a deployment, and why I will pick a plainer stack over a cleverer one when the plainer one is the one the client can still run in three years.

The proof is the London futsal league: six years of continuous work on one codebase, where league tables and matchweeks are updated by editing data on a Sunday night by someone who is not a developer and should not have to be. Nothing about that is technically impressive. It is just the thing that has to be true for a small organisation to keep a system alive.

Handover means handover. No retainer as a condition of the site continuing to work, and no dependency on whether I happen to be available.

The difference

The finance crossover

I also keep books for a living. Knowing what a card settlement actually is — one credit covering forty transactions, less fees, landing two days later — means I can build a payments flow that does not quietly corrupt the VAT position behind it. Knowing how a chart of accounts is used means an export that an accountant can import, rather than a CSV somebody has to fix by hand every month.

It runs the other way too. Having built systems, I can look at a bookkeeping process and see which parts are load-bearing and which are just how somebody did it once.

If the project sits across both, that is the overlap: the bookkeeping side of the practice.

In practice

Two worth reading in full

An FM radio station with a rented audience — strategy as much as build, and the one project here where the search reasoning is the deliverable rather than a property of it.

A restaurant that owns its own bookings — a five-step reservation flow replacing a platform that charged per cover.

All work, delivered and in development →

Stack

What I work with

Languages

  • JavaScript / TypeScript
  • Node.js
  • SQL
  • HTML & CSS

Frameworks

  • Next.js
  • Eleventy
  • SvelteKit
  • Tailwind CSS

Data

  • PostgreSQL / PostGIS
  • Supabase
  • PMTiles / MapLibre
  • WebSockets

Delivery

  • Service workers / PWA
  • Vercel
  • Static hosting
  • Schema.org

Start with a conversation

Tell me what you're trying to build, or what isn't working now. We'll work out the shape of it before anyone writes code.